如何阻止和唤醒提升线程?

时间:2013-07-24 09:16:59

标签: c++ multithreading boost boost-thread

如何阻止一个boost线程并将其从另一个线程中唤醒?线程正在做一些工作,如果工作完成它应该阻塞或睡眠,如果新工作准备好主线程应该弱工作线程。我尝试使用boost ipc message_queue上的阻塞读取,但它不是一个高性能的解决方案。

这样的事情:

void thread()
{
   uint8_t ret=0;
   for(;;) //working loop
   {
      ret=doWork();
      if(ret==WORK_COMPLETE)
      {
         BlockOrSleep();
      }
   }
}

使用pthreads我可以阻塞信号量,但这不是平台独立的。

1 个答案:

答案 0 :(得分:6)

该问题的一个解决方案是Condition Variable,顾名思义,这是一种在线程中等待直到达到条件的方式。这需要线程之间的一些相互合作。

从上面链接的文档中的示例:

线程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();
}