在析构函数中终止当前线程
Posted
技术标签:
【中文标题】在析构函数中终止当前线程【英文标题】:Terminate current thread in destructor 【发布时间】:2017-02-25 10:56:19 【问题描述】:在一个项目中,我们在一个包装类中创建多个状态机。每个包装器都在它自己的线程中运行。作业完成后,包装类析构函数被调用,我们希望在其中停止线程。
虽然如果我们使用thread.join()
,我们会遇到死锁(因为它试图加入自己)。我们可以以某种方式向另一个线程发出信号,但这似乎有点混乱。
有没有办法在对象销毁时正确终止运行类的线程?
【问题讨论】:
我在类中使用线程,通常具有有关系。该类形成了 API 来指导应该在线程函数中完成的事情。如果您使用 FSM,您可能还对我的 STTCL 框架感兴趣。 当包装器的“工作完成”时,一定会返回对应的线程函数吗? 【参考方案1】:thread.join()
不会停止线程。它等待线程完成然后返回。为了停止一个线程,你必须有某种方法告诉线程停止,并且线程必须检查是否该停止。一种方法是使用原子 bool:
class my_thread
public:
my_thread() : done(false)
~my_thread() done = true; thr.join();
void run() thread th(&my_thread::do_it, this); swap(th, thr);
private:
void do_it() while (!done) /* ... */
std::thread thr;
std::atomic<bool> done;
;
这不是我的想法;未编译,未测试。
【讨论】:
以上是关于在析构函数中终止当前线程的主要内容,如果未能解决你的问题,请参考以下文章
为啥我必须在析构函数中调用 MPI.Finalize() ?