4

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

像这样的东西:

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

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

4

1 回答 1

6

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

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

线程 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();
}
于 2013-07-24T09:21:31.077 回答