Инструмент копирования файлов с производителем / моделью потребителя

поэтому я просматривал свое следующее школьное задание, и я сбит с толку. Я подумал, что приду к экспертам по какому-то направлению. Моих знаний о синхронизации крайне не хватает, и я не так уж и горячо выполнил задание «mcopyfile», к которому оно относится. Грозный, вероятно, будет хорошим словом для этого. Если бы я мог получить какое-то руководство о том, как решить эту проблему, это было бы очень ценно. Не ища кого-то, кто мог бы выполнить мое задание, просто нужно, чтобы кто-то указывал мне правильное направление. шаги малыша.

Основан на многопоточном инструменте копирования файлов
(mcopyfile) вы создали в Lab 2, теперь, пожалуйста, используйте рабочий
реализация пула (модель «производитель-потребитель»), использующая фиксированный
количество потоков для обработки нагрузки (независимо от того, сколько файлов в
каталог для копирования). Ваша программа должна создать 1 копию файла производителя
нить и многократное копирование файла потребительскими потоками (это число берется
из аргумента командной строки). Поток производителя копии файла будет
генерировать список (исходного и конечного) файловых дескрипторов в буфере
структура с ограниченным размером. Каждый раз, когда производитель обращается к буферу, он будет писать
одна (исходная, целевая) запись в файле (за посещение). И все файлы копировать
потребительские потоки будут читать из этого буфера, выполнять фактический файл
скопировать задачу и удалить соответствующую запись файла (каждый потребитель
будет потреблять одну запись каждый раз). Как производитель, так и потребитель
потоки напишут сообщение в стандартный вывод с указанием имени файла
и статус завершения (например, для производителя: «Завершение
файл1 в буфере », для потребителя:« Завершение копирования файла1 в… »).

0

Решение

Предполагая, что вы знаете, как создавать темы, позвольте мне решить эту проблему для вас. Есть следующие компоненты:

  1. Режиссер. Генерирует Задачи для Потребители на основе входного параметра каталога источника.
  2. задача. Задача — это информация для потребитель выполнить свою задачу копирования. А именно, кортеж дескриптора исходного файла и дескриптора конечного файла.
  3. Очередь. Это центральная часть связи между Режиссер а также потребитель. Продюсеры пишет Задачи в Очередь а также потребитель потребляет это.
  4. потребитель. У вас есть пул фактических работников, которые принимают задача как ввод и выполняет операцию копирования.

Теперь, в соответствии с вопросом, создайте ветку для производителя и N темы для потребителей. И вот что делают потоки:

  • Продюсерская нить

    1. Для списка файлов в исходном каталоге:
      1. задача <- (Путь к исходному файлу, путь к целевому файлу)
      2. Получить блокировку на Очередь
      3. Написать задача стоять в очереди
      4. Снять блокировку на Очередь
      5. Получить блокировку на стандартный вывод
      6. Написать в стандартный вывод
      7. Снять блокировку на стандартный вывод
  • Потребительская нить

    1. Пока верно:
      1. Если размер очереди == 0:
        1. Спи какое-то время
      2. Else:
        1. Получить блокировку на Очередь
        2. Откажитесь от задача
        3. Снять блокировку на Очередь
        4. Выполнить операцию копирования
        5. Получить блокировку на стандартный вывод
        6. Написать в стандартный вывод
        7. Снять блокировку на стандартный вывод

Надеюсь, это поможет.

1

Другие решения

Ваше назначение кажется мне довольно простым, если вы знаете, какой API / библиотеку вы будете использовать для работы с потоками.

Сначала вы проанализируете аргумент командной строки и создадите указанное количество потоков, затем из основного потока получите список файлов в папке и начнете помещать их в массив (например, std :: vector), который является общим среди потоков и синхронизируется с мьютексом (или критическим разделом в Windows). Всякий раз, когда один из потоков-получателей получает мьютекс, он создает копию записи файла в массиве, удаляет эту запись из массива, освобождает мьютекс, чтобы другой поток мог начать делать то же самое, и начинает копировать файл, представленный запись удалена из массива.

Я бы дал вам несколько фрагментов кода, но вы не сказали, какой API / библиотека вы используете для работы с потоками.

0