Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何阻止和唤醒一个boost线程?_C++_Multithreading_Boost_Boost Thread - Fatal编程技术网

C++ 如何阻止和唤醒一个boost线程?

C++ 如何阻止和唤醒一个boost线程?,c++,multithreading,boost,boost-thread,C++,Multithreading,Boost,Boost Thread,如何阻止一个boost线程并将其从另一个线程唤醒?线程正在做一些工作,如果工作完成,它应该阻塞或休眠,如果新工作准备就绪,主线程应该削弱工作线程。我在boost ipc消息队列上尝试了阻塞读取,但这并不是一个高性能的解决方案 大概是这样的: void thread() { uint8_t ret=0; for(;;) //working loop { ret=doWork(); if(ret==WORK_COMPLETE) {

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

大概是这样的:

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

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

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

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

线程1:
boost::条件变量cond;
mutexmut;
bool数据准备就绪;
作废进程_数据();
void wait_for_data_to_process()
{
boost::唯一锁定(mut);
当(!数据准备就绪)
{
等待(锁定);
}
处理_数据();
}
线程2:
void检索_数据();
void prepare_data();
void准备\u数据\u进行\u处理()
{
检索_数据();
准备_数据();
{
boost::lock_guard lock(mut);
数据_ready=true;
}
第二,通知某人;
}
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();
}