[英]kill boost thread after n seconds
我正在寻找解决以下(c ++)问题的最佳方法。 我有一个框架给出的函数,它返回一个对象。 有时它只需几毫秒,但在某些情况下需要几分钟。 所以我想停止执行,如果它需要比说2秒更长的时间。 我正在考虑使用boost线程来做这件事。 重要的旁注,如果函数返回的速度超过2秒,则程序不应该等待。 所以我在考虑2个线程:
1.thread: execute function a
2.thread: run timer
if(thread 2 exited bevore thread 1) kill thread 1
else do nothing
我对实际实施有点兴奋。 特别,
至于等待,只需在主线程中使用thread::timed_join()
,如果线程在给定时间内没有完成,则返回false
。
如果您的第三方库不知道boost:threads,则杀死该线程是不可行的。 而且,你几乎肯定不想在不给功能清理的情况下“杀死”线程。
我建议你等待,比如2秒,然后继续发出某种错误信息,让框架功能完成它的工作,如果来不及就忽略结果。
至于返回一个值,我建议像
struct myfunction {
MyObj returnValue;
void operator() () {
// ...
returnValue = theComputedReturnValue;
}
};
// ...
myfunction f;
boost::thread t = boost::thread(boost::ref(f));
t.join(); // or t.timed_join()...
use(f.returnValue);
// ...
我过去做过类似的事情并且有效(尽管不理想)。 要获得返回值只是“共享”一个变量(可能只是一个指针(最初为零)返回值,或者一个完整的对象具有状态等...)并让你的线程读取/更新它。 不要忘记它需要互斥。 这应该是非常直截了当的。
扩展詹姆斯上面所说的“杀死一个线程”是一个如此严厉的术语! :)但是中断也不是那么容易,通常使用boost线程,需要有一个中断点,在这里可以中断正在运行的线程。 有一组这些可中断函数(不幸的是它们是特定于boost的),例如等待/睡眠等。你有一个选项是在第一个线程中,自由地分散interruption_points()。 这样,当线程2死亡时调用interrupt(),在下一个interruption_point()线程1将抛出异常。
线程位于相同的进程空间中,因此只要存在对该共享状态的同步访问,您就可以在多个线程之间拥有共享状态。
编辑:刚刚注意到OP已经调查了这个......无论如何我都会留下答案...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.