【发布时间】:2011-06-02 01:20:55
【问题描述】:
我在 C++ 中创建了一个线程池,它将所有任务存储在一个队列中。线程池启动 n 个线程,从队列中获取任务,处理每个任务,然后从队列中删除任务。
现在,我想等到所有任务都完成。检查空队列以完成任务可能不起作用,因为可以将任务分配给每个线程,并且可以清空队列,但任务仍然可以处于处理模式。
我不知道如何等待所有任务完成。这是一个设计问题。有什么建议吗?
【问题讨论】:
标签: c++ windows threadpool
我在 C++ 中创建了一个线程池,它将所有任务存储在一个队列中。线程池启动 n 个线程,从队列中获取任务,处理每个任务,然后从队列中删除任务。
现在,我想等到所有任务都完成。检查空队列以完成任务可能不起作用,因为可以将任务分配给每个线程,并且可以清空队列,但任务仍然可以处于处理模式。
我不知道如何等待所有任务完成。这是一个设计问题。有什么建议吗?
【问题讨论】:
标签: c++ windows threadpool
您需要等待所有线程完成,还是只需要检查?
如果你只需要检查,你可以有一个变量来存储当前正在执行的任务的数量,InterlockedIncrement它在一个线程的开头,然后InterlockedDecrement它在结尾。
如果你需要等待,并且你有少量线程,每个线程都可以有自己的手动重置事件,当线程启动时你ResetEvent,当它结束时SetEvent。然后只需 WaitForMultipleObjects 即可参加所有活动。
【讨论】:
使用通知处理线程退出的哨兵任务。将这些任务中的 n 个放入队列中。然后加入你的线程池。
您显然可以修改它,这样您就可以做一些让池保持活动的事情,而不是使用退出/加入进行同步。例如,每个线程可以在使哨兵任务出列时同步某种条件变量或屏障或计数信号量。
【讨论】: