暂停boost :: thread无限时间

时间:2010-12-16 09:30:59

标签: c++ multithreading boost boost-thread

我正在使用boost :: thread库(V1.44)来支持我的C ++项目中的线程。

用户需要能够暂停执行一个测试循环,该循环在自己的线程中运行,无限时间 并且只要他愿意,就能恢复它。

在Windows下我解决了这个问题

bool ContintueLoop(){
if(testLoopPaused){ //testLoopPaused can be set by the user via  GUI elements
  try{
      boost::this_thread::interruptible_wait( 2147483648 ); //that's very ugly,
      // somebody knows the right way to pause it for a unlimited time?
      return true;
     }
  catch( boost::thread_interrupted& e ){ //when the user selects resume the 
      // the thread is interrupted and continues from here
      testLoopPaused = false;
      return true;
     }
if( ... ) //test for other flags like endTestLoop etc.
  ....
}

这没有任何问题,即使知道无限制中断的正确值也会很好。

我开始实现我的程序的linux版本,但我遇到了问题 我得到编译器错误

  

错误:interruptible_wait不是boost::this_thread

的成员

问题:在无限时间内暂停boost :: thread的好方法是什么(直到用户决定恢复它为止)

非常感谢

2 个答案:

答案 0 :(得分:18)

我不知道有任何方法可以使用boost :: thread在任意点暂停一个线程,但是,您所描述的场景可以使用布尔值,互斥量和条件变量来实现。

bool m_pause; // initialise to false in constructor!
boost::mutex m_pause_mutex;
boost::condition_variable m_pause_changed;

void block_while_paused()
{
    boost::unique_lock<boost::mutex> lock(m_pause_mutex);
    while(m_pause)
    {
        m_pause_changed.wait(lock);
    }
}

void set_paused(bool new_value)
{
    {
        boost::unique_lock<boost::mutex> lock(m_pause_mutex);
        m_pause = new_value;
    }

    m_pause_changed.notify_all();
}

因此,在您的工作线程中,您可以定期调用block_while_paused(),直到m_pause设置为false才会返回set_paused(value)。在主线程中,调用{{1}}以线程安全的方式更新pause变量的值。

免责声明:这是根据我们在这里的一些类似代码改编的,但我没有尝试编译改编的代码,更不用说验证它实际上有效了:)

答案 1 :(得分:1)

如果任何人仍然需要提到的功能(在事件发生之前一直处于休眠状态)并且很舒服使用boost库,那么 Boost.Interprocess 库提供信号量机制,可以用作有问题的描述。