【问题标题】:Terminate current thread in destructor在析构函数中终止当前线程
【发布时间】:2017-02-25 10:56:19
【问题描述】:

在一个项目中,我们在一个包装类中创建多个状态机。每个包装器都在它自己的线程中运行。作业完成后,包装类析构函数被调用,我们希望在其中停止线程。

虽然如果我们使用thread.join(),我们会遇到死锁(因为它试图加入自己)。我们可以以某种方式向另一个线程发出信号,但这似乎有点混乱。

有没有办法在对象销毁时正确终止运行类的线程?

【问题讨论】:

  • 我在类中使用线程,通常具有关系。该类形成了 API 来指导应该在线程函数中完成的事情。如果您使用 FSM,您可能还对我的 STTCL 框架感兴趣。
  • 当包装器的“工作完成”时,一定会返回对应的线程函数吗?

标签: c++ multithreading c++11


【解决方案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;
};

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

【讨论】:

    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2021-12-12
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多