您可以通过使用条件变量轻松地使用单生产者/多消费者模型来做到这一点。请记住,这是一种架构,其他架构当然是可能的。
在主线程中,您只需创建队列、互斥锁和条件变量,然后启动任意数量的线程运行,伪代码如:
glbQueue = []
glbMutex = new mutex
glbCondVar = new condvar
for i = 1 to 10:
    start thread using thrdFn
下一步是将您需要的任何工作项添加到队列中(使用互斥锁)并根据需要启动条件变量以唤醒线程:
while workitem = getNextWorkItem():
    lock glbMutex
    glbQueue.append (workItem)
    kick glbCondVar
    unlock glbMutex
一旦所有工作项完成,您等待队列清空,然后发布一些哨兵项目以关闭线程,然后等待它们完成后再退出。
lock glbMutex
while glbQueue is not empty:
    kick glbCondVar
    unlock glbMutex.
    sleep for a bit
    lock glbMutex
unlock glbMutex.
for i = 1 to 10:
    lock glbMutex
    glbQueue.append (endWorkItem)
    kick glbCondVar
    unlock glbMutex.
    wait for any one thread to exit
exit
完成工作的线程也相对简单。首先,它们在无限循环中运行,等待条件变量被踢出。在该循环中,他们处理工作项,直到没有更多可用项,然后他们重新进入睡眠状态。
一旦线程接收到最终工作项,它就会退出,从而保证每个线程都获得一个最终项。
换句话说,类似:
initialise
stillGoing = true
lock glbMutex
while stillGoing:
    wait on glbCondVar using glbMutex
    while stillGoing and glbQueue is not empty:
        extract workItem from glbQueue to thread local storage
        unlock glbMutex.
        if workItem is endWorkItem:
            stillGoing = false
        else:
            do the work specified by workItem
        lock glbMutex
unlock glbMutex
clean up
exit thread
这基本上允许您在队列上拥有固定数量的线程处理项目,并且队列本身受到互斥锁的保护,因此工作线程或主线程之间没有争用。