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

sch*_*flo 4 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();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

Kaz*_*gon 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();
}
Run Code Online (Sandbox Code Playgroud)

线程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();
}
Run Code Online (Sandbox Code Playgroud)