如何阻止一个boost线程并将其从另一个线程中唤醒?线程正在做一些工作,如果工作完成它应该阻塞或睡眠,如果新工作准备好主线程应该弱工作线程。我尝试使用boost ipc message_queue上的阻塞读取,但它不是一个高性能的解决方案。
这样的事情:
void thread()
{
uint8_t ret=0;
for(;;) //working loop
{
ret=doWork();
if(ret==WORK_COMPLETE)
{
BlockOrSleep();
}
}
}
使用pthreads我可以阻塞信号量,但这不是平台独立的。
答案 0 :(得分:6)
该问题的一个解决方案是Condition Variable,顾名思义,这是一种在线程中等待直到达到条件的方式。这需要线程之间的一些相互合作。
从上面链接的文档中的示例:
boost::condition_variable cond;
boost::mutex mut;
bool data_ready;
void process_data();
void wait_for_data_to_process()
{
boost::unique_lock<boost::mutex> lock(mut);
while(!data_ready)
{
cond.wait(lock);
}
process_data();
}
void retrieve_data();
void prepare_data();
void prepare_data_for_processing()
{
retrieve_data();
prepare_data();
{
boost::lock_guard<boost::mutex> lock(mut);
data_ready=true;
}
cond.notify_one();
}