Boost(v1.33.1)线程中断

时间:2009-12-14 13:50:38

标签: c++ boost multithreading

如何中断睡眠/阻止的boost :: thread?

我正在使用Boost v1.33.1,升级不是一种选择。

谢谢。

3 个答案:

答案 0 :(得分:1)

快速浏览1.33中boost.thread的文档表明,没有可移植的方法来实现中断。在1.35中引入了线程中断(对于其中一个提升“中断点”中的线程)。

因此,我能想到的唯一选择是使用信号(也不是1.33,所以你需要依赖,例如,pthreads)结合任何方法的超时阻止。基本上使用信号唤醒睡眠中的线程,让它们等待信号休眠,并在阻塞线程上超时让它们唤醒并检查它们是否应该退出。不幸的是,这是一个非常不受欢迎的解决方案,并且在某种程度上相当于内部的更新版本的内容。无论如何。

如果您正在使用boost.thread,那么您应该考虑升级到其他项目的更新版本,因为1.33不支持绝大多数对多线程必不可少的构造。

答案 1 :(得分:1)

我同意begray,研究条件变量。如果你有想要随时醒来的线程,那么它们就是你希望使用的东西。如果你期望线程会阻塞其他调用(比如调用BSD套接字或类似的东西),这对你没有帮助。如果存在,您将需要直接使用这些调用的超时工具。

以下是一个示例,仅使用boost 1.33.1中提供的工具。我没有编译它,所以可能会有小错误。我已经包含了一个模糊的Work类,但你根本不需要使用共享数据来使用这个模式。只需要互斥锁和条件变量。

Work work;
boost::condition workAvailable; 
boost::mutex workMutex; 

void Producer() 
{
  {
    boost::mutex::scoped_lock lock(workMutex);
    UpdateWork(work);
    workAvailable.notify_one();  
  }
  boost::mutex::scoped_lock lock(workMutex);
  work.SetOver();
  workAvailable.notify_one();
}

void Consumer() 
{ 
  //This thread uses data protected by the work mutex
  boost::mutex::scoped_lock lock(workMutex);
  while(true) 
  { 
    //this call releases the work mutex
    //when this thread is notified, the mutex is re-acquired
    workAvailable.wait(lock); 
    //once we have the mutex we can work with shared data
    //which might require this thread to terminate
    if(work.Over())
    {
      return;
    }
    DoWork(work);
  }
}

生产者线程将创建一个工作单元,然后阻止。消费者线程将完成工作,然后阻止。然后生产者线程将设置终止条件并退出。消费者将退出。

答案 2 :(得分:0)

无法在boost :: thread中断中被阻塞的线程。您需要自己实现正确的线程中断,例如使用boost :: conditional。

AFAIK任何现有的中断正在运行的线程的方法(例如Windows API中的TerminateThread)只会导致问题(内存泄漏其中一个)。