在析构函数中终止当前线程

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;
;

这不是我的想法;未编译,未测试。

【讨论】:

以上是关于在析构函数中终止当前线程的主要内容,如果未能解决你的问题,请参考以下文章

为啥在析构函数中抛出异常时不调用重载删除?

在析构函数中捕获异常

MySQLi 在析构函数中立即关闭

为啥我必须在析构函数中调用 MPI.Finalize() ?

即使内存不是动态分配的,在析构函数中是不是需要`delete ptr;`? [复制]

c ++在析构函数中删除向量类成员内存