我怎样才能阻止一个 boost 线程并从另一个线程唤醒它?线程正在做一些工作,如果工作完成,它应该阻塞或休眠,如果新工作准备就绪,主线程应该削弱工作线程。我尝试在 boost ipc message_queue 上进行阻塞读取,但这不是一个高效的解决方案。
像这样:
void thread()
{
uint8_t ret=0;
for(;;) //working loop
{
ret=doWork();
if(ret==WORK_COMPLETE)
{
BlockOrSleep();
}
}
}
使用 pthreads 我可以在信号量上阻塞,但这不是平台独立的。
最佳答案
该问题的一个解决方案是 Condition Variable ,顾名思义,这是一种在线程中等待直到达到条件的方法。这需要线程之间的一些相互合作。
来 self 上面链接的文档中的示例:
线程 1:
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();
}
线程 2:
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();
}
关于c++ - 如何阻止和唤醒 boost 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17829843/