Есть ли шаблон дизайна, отличный от производителя, чтобы описать этот шаблон? - PullRequest
0 голосов
/ 30 марта 2012

В моем приложении на C ++ я использую pthreads. У меня есть основной поток, который распределяет работу в другой поток для чтения с диска и третий поток для записи на диск. Это позволяет основному потоку работать в реальном времени и не получать сбои из-за диска io потоком чтения, опережающим потребление основных потоков, и потоком записи, идущим в ногу с производством основных потоков. Другими словами, поток чтения создает данные для обработки основным потоком, а поток записи потребляет данные, созданные основным потоком.

В моем приложении у меня есть общие ресурсы между основным потоком и потоком чтения, и у меня есть другой набор общих ресурсов между основным потоком и потоком записи. В течение периодов, когда синхронизация между потоками не требуется, основной поток свободно обращается к общим ресурсам потоков чтения и записи. Затем, когда он хочет предоставить работу для чтения или записи, он устанавливает общие ресурсы, чтобы указать требуемую работу, и затем выпускает переменную условия, чтобы уведомить поток чтения или записи (в зависимости от ситуации), что он должен собрать запрос от общая зона. Затем он блокирует себя до тех пор, пока запрашиваемый поток не завершит сбор запроса и не выпустит отдельную переменную условия, от которой он ожидает. Таким образом, основной поток в своем нормальном состоянии получает доступ к общему ресурсу и затем блокирует себя, ожидая условия в течение периодов, когда его поток чтения или записи нуждается в доступе, тогда как потоки чтения и записи противоположны тем, что в своем нормальном состоянии они не обращайтесь к общему ресурсу, но делайте это только в периоды синхронизации, когда основной поток подал сигнал и ожидает, пока он завершит доступ.

Вот некоторый очень грубый псевдокод (не беспокойтесь о точном потоке, это лишь приблизительное представление о функционирующем коде):

MainThread:
  do {
    While (no pending requests) {
      manipulate shared resources;
    }
    if (need write && ready for read requests) {
      setup write request in shared resources;
      Release condition startWrite variable;
      Wait on condition endWrite variable;
    }
    if (need read && ready for read requests) {
      setup read request in shared resources;
      Release condition startRead variable;
      Wait on condition endRead variable;
    }
  }
ReadThread:
  do {
    Notify I am ready for read requests;
    Wait on condition startRead;
    copy request out of shared resources;
    update shared resources to account for reads completed;
    Release condition EndRead;
    Perform Read from disk;
  }
WriteThread:
  do {
    Notify I am ready for write requests;
    Wait on condition startWrite;
    copy request out of shared resources;
    update shared resources to account for writes completed;
    Release condition EndWrite;
    Perform write to disk;
  }

Мой вопрос заключается в том, считается ли это просто обычным шаблоном дизайна потребителя производителя или существует более конкретный общепринятый шаблон дизайна, который описывал бы то, что я создал?

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Вы получаете некоторую фоновую активность для выполнения ввода и вывода, независимо от основной обработки. Чтения могут быть запланированы заранее, поэтому данные уже находятся там, когда это необходимо, а записи могут быть отнесены к фоновым действиям, поэтому основной линии не нужно блокировать при вводе данных в хранилище.

У этого «шаблона проектирования» есть имя, известное как «асинхронный ввод-вывод».

0 голосов
/ 30 марта 2012

Вы можете описать это как пример шаблона «Мастер / Рабочий». Главный поток передает работу (запросы на чтение или запись) рабочим потокам (поток чтения и запись).

0 голосов
/ 30 марта 2012

Вы смотрели на схему блокировки чтения / записи ? Шаблон планировщика был бы другой идеей, хотя я не уверен, насколько хорошо это будет работать в данной ситуации.

...