我正在寻找解决以下(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
我对实际实施有些不满。特别是,
答案 0 :(得分:2)
至于等待,只需在主线程中使用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);
// ...
答案 1 :(得分:0)
过去我做过类似的事情并且有效(尽管不理想)。 要获得返回值只是“共享”一个变量(可能只是一个指针(最初为零)返回值,或者一个完整的对象具有状态等...)并让你的线程读取/更新它。不要忘记它需要互斥。这应该是非常直截了当的。
答案 2 :(得分:0)
扩展詹姆斯上面所说的“杀死一个线程”是一个如此严厉的术语! :)但是中断也不是那么容易,通常使用boost线程,需要有一个中断点,在这里可以中断正在运行的线程。有一组这些可中断函数(不幸的是它们是特定于boost的),例如等待/睡眠等。你有一个选项是在第一个线程中,自由地分散interruption_points()。这样当你在线程2死亡时调用interrupt()时,在下一个interruption_point()线程1将抛出异常。
线程位于相同的进程空间中,因此只要存在对该共享状态的同步访问,您就可以在多个线程之间拥有共享状态。
编辑:刚刚注意到OP已经对此进行了调查......无论如何我都会留下答案......