通常,您使用生产者-消费者队列来完成此类工作。
每当工作线程用完工作时,他wait()
就在一个boost::condition_variable
受保护boost::mutex
的堆栈与保存工作线程数据的堆栈相同(您可能希望在此处使用队列来最大程度地减少不公平工作调度的风险)。
您的PushFrame()
函数现在notify_one()
在将新数据插入堆栈时调用该条件变量。这样,工作线程将真正休眠(即操作系统调度程序可能不会给它任何时间片),直到真正有工作要做。
这里最容易出错的是互斥锁的锁定,它同时保护了堆栈和 condition_variable。除了避免数据结构上的竞争之外,您还需要注意 condition_variable 不会错过通知调用,因此可能会在实际上有更多可用工作时卡住等待。
class Worker {
void PushFrame(byte* data)
{
boost::lock_guard<boost::mutex> lk(m_mutex);
// push the data
// ...
m_data_cond.notify_one();
}
void DoWork()
{
while(!done) {
boost::unique_lock<boost::mutex> lk(m_mutex);
// we need a loop here as wait() may return spuriously
while(is_out_of_work()) {
// wait() will release the mutex and suspend the thread
m_data_cond.wait(lk);
// upon returning from wait() the mutex will be locked again
}
// do work from the queue
// ...
}
}
boost::mutex m_mutex;
boost::condition_variable m_data_cond;
[...]
};