C++ Boost(v1.33.1)线程中断
如何中断休眠/阻塞的boost::线程 我使用的是BoostV1.33.1,升级不是一个选项C++ Boost(v1.33.1)线程中断,c++,boost,multithreading,C++,Boost,Multithreading,如何中断休眠/阻塞的boost::线程 我使用的是BoostV1.33.1,升级不是一个选项 谢谢。在boost::thread中无法中断阻塞的线程。您需要自己实现适当的线程中断,例如使用boost::conditional AFAIK任何中断正在运行的线程的现有方法(例如Windows API中的TerminateThread)只会导致问题(内存泄漏)。快速阅读1.33中boost.thread的文档表明,没有可移植的方法来实现中断。线程中断是在1.35中引入的(对于一个boost“中断点”中
谢谢。在boost::thread中无法中断阻塞的线程。您需要自己实现适当的线程中断,例如使用boost::conditional
AFAIK任何中断正在运行的线程的现有方法(例如Windows API中的TerminateThread)只会导致问题(内存泄漏)。快速阅读1.33中boost.thread的文档表明,没有可移植的方法来实现中断。线程中断是在1.35中引入的(对于一个boost“中断点”中的线程) 因此,我能想到的唯一选择是在任何阻塞的方法上使用信号(1.33中也没有,因此您需要依靠pthreads等)和超时。基本上,通过让休眠线程等待信号和阻塞线程上的超时来唤醒处于休眠状态的线程,并检查它们是否应该退出。不幸的是,这是一个非常不受欢迎的解决方案,在某种程度上相当于boost的新版本在内部所做的工作
如果使用BooSt.To线,那么你应该考虑升级到其他项目的最新版本,因为1.33不支持大多数线程的基本结构。
< P>我同意BeGy,查看条件变量。如果您有一些线程希望不时醒来,那么boost希望您使用这些线程。如果您期望线程会阻止其他调用(例如对BSD套接字的调用或类似的调用),这对您没有帮助。您需要直接使用这些调用的超时功能(如果存在) 下面是一个示例,仅使用boost 1.33.1中提供的工具。我还没有编译它,所以可能会有一些小错误。我已经介绍了模糊工作类的使用,但是使用这种模式根本不需要使用共享数据。只需要互斥量和条件变量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);
}
}
生产者线程将创建一个工作单元,然后阻塞。使用者线程将完成该工作,然后阻塞。然后生产者线程将设置终止条件并退出。然后消费者将退出。为什么它会休眠/被阻止?如果您需要能够按需唤醒它,那么让它等待条件变量、互斥体或其他东西不是更有意义吗?如果您可以建议更好的解决方案,我正在尝试为某段代码添加一个超时:我有一个阻塞调用,它接收新数据并将其保存为最新数据。此数据有一个生命周期,我需要在它过期时触发一个事件,除非我同时收到新数据,在这种情况下,我将超时重新初始化为新的生命周期并再次等待。阻塞调用是您需要的不可变的旧代码,还是您可以将其更改为非阻塞/超时?不幸的是,阻塞调用是必要的,而且也无法保证它能以多快的速度恢复;从瞬间到>1s。我刚刚注意到关于阻塞遗留调用的评论,这是这个问题的核心。这肯定无助于回答最初的问题。我不知道在boost 1.33.1中是否有安全的方法来终止阻塞调用。如果遗留调用是异常安全的,那么boost的后续版本会有所帮助。我考虑过删除这个,但我将把它留在这里,因为答案可能对OP以外的人有用。