c++ - 如何阻止和唤醒 boost 线程?

标签 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 我可以在信号量上阻塞,但这不是平台独立的。

最佳答案

该问题的一个解决方案是 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/

相关文章:

python - geopandas 的最快方法(读取和空间连接)

c++ - boost boost::posix_time::milliseconds 可以将接近 0 的值变成 0 吗?

c++ - boost.graph 1.56.0 和 g++ 4.6.4 编译错误

c++ - 将派生类传递给基类参数的函数

c++ - 如何在 opengl Tessellation Evaluation 着色器中插入矩阵

ios - 线程正在执行行,但无效

multithreading - 在 Linux 中使用多队列 NIC

c++ - Boost.Test 和 fork

C++ 对象.getClass().getMethods()

Java、JNI 和 C++ : How do I generate a header file from native method declarations?