Как узнать, когда работа выполнена с CThreadPool? - PullRequest
1 голос
/ 06 марта 2009

Я недавно обнаружил класс ATTh CThreadPool и был очень доволен этой находкой. Это аккуратный маленький класс, который позаботится о семантике синхронизации, состоящей в том, чтобы иметь несколько рабочих потоков для обработки некоторой очереди запросов. Задачи передаются объекту CThreadPool каким-то внешним процессом.

Будучи очень аккуратным и чистым, похоже, не существует способа узнать, все ли задачи были выполнены случайно. Какой лучший способ сделать это?

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

Итак, я создаю CThreadPool с 10 потоками, ставлю задачи в очередь и выключаю их до потоков. Как я узнаю, когда задачи будут выполнены?

Боаз

Ответы [ 2 ]

1 голос
/ 06 сентября 2009

Самый чистый способ ожидания выполнения задачи - создать событие , а затем дождаться завершения рабочего потока, вызвав WaitForSingleObject.

1 голос
/ 06 марта 2009

Я думаю, вам нужно, чтобы метод Execute() вашего рабочего объекта использовал некоторую форму IPC, которую может отслеживать "основной" поток. Что-то вроде вызова метода Execute() ReleaseSemaphore() на семафоре, на котором основной поток может ожидать и считать, сколько раз ожидание завершилось. Или работники пула потоков могут публиковать сообщения, указывающие, что они выполнены с рабочим элементом, в очередь сообщений, из которой основной поток получает сообщения.

...