如何中断睡眠/阻止的boost :: thread?
我正在使用Boost v1.33.1,升级不是一种选择。
谢谢。
答案 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)只会导致问题(内存泄漏其中一个)。