Как синхронизировать процесс со случайным количеством активных потоков? - PullRequest
0 голосов
/ 18 декабря 2018

У меня следующая проблема.Мой процесс порождает 4 потока, которые выполняют одну и ту же задачу независимо друг от друга и должны ждать, пока все они завершат обработку, прежде чем перейти к следующей итерации обработки.Однако количество активных потоков, т. Е. Количество потоков, обрабатывающих данные и ожидающих завершения остальных, варьируется от 1 до 4. Например, иногда два потока будут обрабатывать данные, и им нужно ждать друг другапрежде чем продолжить.

Я читал, что барьеры могут сделать это для меня, однако, когда они создаются, я должен указать количество ожидающих потоков, что не относится к моему приложению.Кроме того, из-за способа реализации приложения было бы неудобно и сложно каждый раз создавать / уничтожать барьеры.

Мне было интересно, есть ли другой способ решения этой проблемы.

Спасибо!

1 Ответ

0 голосов
/ 20 декабря 2018

Это то, как вы можете добиться этого, используя семафор.

// Global Sempahore initialized to zero.
Sempahore global_sempahore(0)

// Your main thread which spawns your 'n' worker thraeds.
// After spawning 'n' threads your main thread will wait for those threads to finish.
for (int i=0; i<n; i++) {
    global_sempahore.sem_wait();
}


// This is your worker thread routine.
// After processing the common work routine before exiting each thread will signal the sempahore.
global_sempahore.sem_post();

Идея состоит в том, чтобы инициализировать семафор в заблокированном режиме с 0. После того, как ваши n рабочие потоки в основном потоке ждутна семфахоре в течение n раз.

В рабочем потоке непосредственно перед выходом сигнализирует семафор.

Это будет гарантировать, что основной поток проснется только тогда, когда все n потоков завершено.

...