2013-03-17 2 views
3

У меня есть сценарий, для которого я пытаюсь найти наилучший подход к синхронизации. Предположим, что std :: thread в C++ 11 присутствует, поэтому не нужно беспокоиться о различиях между различными библиотеками потоков и т. Д.Синхронизация рабочих потоков

Сценарий это. Thread a, основной поток, хочет раздавать задания на кучу рабочих потоков. Затем, после выдачи окончательной инструкции на время, ему нужно дождаться, пока все потоки завершат свою работу. Мы не хотим присоединяться к ним, просто ждите, пока они закончат задание. Затем поток a должен проанализировать собранные данные из всех потоков, а затем отправить команды рабочим, чтобы снова начать процедуру.

Одним словом, это шаги.

  1. Нить a посылает команду x всем рабочим потокам.
  2. Нить в ожидании, пока все рабочие не закончат.
  3. Нить a обрабатывает.
  4. Вернуться к 1.

Что вы могли бы предложить, что я использую? Простые мьютексы? Переменные условия? Сочетание двух? Любые советы о том, как структурировать синхронизацию должны быть как можно более эффективными, будут оценены.

ответ

1

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

Основная методика заключается в использовании барьера (например, boost::barrier) для синхронизации конца рабочих потоков и a.

Барьер инициализируется по адресу n+1. Основная тема a ждет на барьере, и каждый рабочий поток выполняет то же самое в конце своей задачи. Когда последний поток называется wait на барьере, все потоки разбужены, и основной поток может продолжить свою работу. Возможно, вы захотите добавить второй барьер для блокировки рабочих потоков до тех пор, пока им не будет назначена новая задача.

Тело рабочего потока может выглядеть следующим образом псевдокода:

while (running) { 
    startbarrier.wait(); // wait for main thread to signal start 
    do_work(); 
    endbarrier.wait(); // signal end of work 
} 

То же самое может быть реализован с семафорами. Оба семафора и барьера могут быть реализованы с помощью мьютекса и переменной условия.

Для получения более подробной информации см. this SO question.

+0

Барьеры оказались именно тем, что мне нужно. Спасибо! –

+0

рад помочь. – didierc

+0

@didierc Я думаю, 'n' - количество потоков. Но всегда лучше определить переменные. – user877329

Смежные вопросы