Дождитесь завершения задач в пуле потоков - PullRequest
4 голосов
/ 31 декабря 2010

Я создал пул потоков в C ++, который хранит все задачи в очереди.Пул потоков запускает n потоков, которые берут задачи из очереди, обрабатывают каждую задачу и затем удаляют задачи из очереди.

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

Я не понимаю, как ждать всехвыполнение задач. Это проблема дизайна.Есть предложения?

Ответы [ 2 ]

4 голосов
/ 31 декабря 2010

Вам нужно дождаться завершения всех потоков, или вам просто нужно проверить?

Если вам просто нужно проверить, вы можете иметь переменную, которая хранит количество выполняемых в данный момент задач, иInterlockedIncrement это в начале потока, затем InterlockedDecrement это в конце.

Если вам нужно подождать, и у вас есть небольшое количество потоков, каждый поток может иметь собственное событие ручного сбросачто вы ResetEvent, когда начинается поток и SetEvent, когда он заканчивается.Тогда просто WaitForMultipleObjects для всех событий.

1 голос
/ 31 декабря 2010

Используйте задачу, которая указывает потоку обработки на выход.Поместите эти задачи в очередь.Затем присоединитесь к пулу потоков.

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

...