繁体   English   中英

n秒后杀死提升线程

[英]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

我对实际实施有点兴奋。 特别,

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

至于等待,只需在主线程中使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM