n秒后杀死提升线程

时间:2010-10-27 08:25:50

标签: c++ multithreading boost

我正在寻找解决以下(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

我对实际实施有些不满。特别是,

  • 如何将一个对象从子boost线程返回到主线程?
  • 如何在boost中杀死一个线程?
  • 我的想法甚至是一个好的,有没有更好的方法来解决c ++中的问题(有或没有提升)?

3 个答案:

答案 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已经对此进行了调查......无论如何我都会留下答案......