我在C ++中创建了一个线程池,它将所有任务存储在队列中。线程池启动n个线程,这些线程从队列中获取任务,处理每个任务,然后从队列中删除任务。
现在,我想等到所有任务完成。检查空队列以完成任务可能不起作用,可以为每个线程提供任务,队列可以清空,但任务仍然可以处理模式。
我不知道如何等待所有任务完成。这是一个设计问题。有什么建议吗?
答案 0 :(得分:4)
你需要等待所有线程完成,还是只需要检查?
如果你只需要检查,你可以有一个变量来存储当前正在执行的任务的数量,InterlockedIncrement
它在一个线程的开头,然后InterlockedDecrement
在最后。< / p>
如果您需要等待,并且您拥有少量线程,则每个线程都可以拥有自己的手动重置事件,您在线程启动时ResetEvent
,并在完成时SetEvent
。然后只需WaitForMultipleObjects
即可获得所有活动。
答案 1 :(得分:1)
使用sentinal任务告诉处理线程退出。将这些任务中的n个放在队列中。然后加入你的线程池。
你可以明显地修改它,这样你就可以做一些让游泳池保持活力的东西,而不是使用exit / join进行同步。例如,每个线程可以在某种条件变量或屏障上进行同步,或者在信号队列出任务时计算信号量。