C++ 在n秒后杀死提升线程

C++ 在n秒后杀死提升线程,c++,multithreading,boost,C++,Multithreading,Boost,我正在寻找解决以下(c++)问题的最佳方法。我有一个框架给出的函数,它返回一个对象。有时只需要几毫秒,但有时需要几分钟。如果执行时间超过2秒,我想停止执行。 我正在考虑用boost线程来实现它。重要提示:如果函数返回速度超过2秒,则程序不应等待。 所以我考虑了两个线程: 1.thread: execute function a 2.thread: run timer if(thread 2 exited bevore thread 1) kill t

我正在寻找解决以下(c++)问题的最佳方法。我有一个框架给出的函数,它返回一个对象。有时只需要几毫秒,但有时需要几分钟。如果执行时间超过2秒,我想停止执行。 我正在考虑用boost线程来实现它。重要提示:如果函数返回速度超过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++中的问题(有或没有Boost)?
我过去也做过类似的事情,效果很好(尽管不理想)。
要获取返回值,只需“共享”一个变量(可能只是指向返回值的指针(最初为零),或者是一个带有状态的完整对象等等),并让线程读取/udate它。别忘了根据需要对其进行互斥。这应该很直截了当

扩展詹姆斯上面所说的,“杀死一根线”是一个非常苛刻的术语!)但是中断也不是那么容易,通常对于boost线程,需要有一个中断点,在这里可以中断正在运行的线程。有一组可中断函数(不幸的是,它们是特定于boost的),例如等待/睡眠等。您可以选择在第一个线程中,随意分散中断点()。这样,当线程2死后调用interrupt()时,在下一次中断时,线程1将抛出一个异常

线程位于相同的进程空间中,因此,只要对共享状态有同步访问,就可以在多个线程之间拥有共享状态


编辑:刚刚注意到OP已经调查过这个。。。不管怎样,我猜答案还是会保留的…

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

你并不真的想杀死线程;你想。只是出于好奇:你使用的框架是什么,有时需要很长时间才能创建一个对象?我在考虑一个中断,但我看到的问题是我必须创建中断点,我不能,因为我不能修改我必须在线程中调用的框架函数。这个问题,正如已经在obove注释中描述的那样,我不能放置中断点,我的线程函数看起来只有这样:threadfunc(){myobject=someframework.CallFunction()}在这种情况下,我认为您被卡住了,我只能想一种其他方法来解决这个问题-fork()并将第一个线程作为单独的进程运行,然后杀死它?但是共享状态会变得混乱,我想你可以用共享内存来解决这个问题?谢谢,看起来它能工作。post中只有一种类型,它应该是第3行中的运算符()。