在C ++ 11中的std :: thread,如何确保在析构函数内完成一个线程

时间:2013-08-23 20:21:03

标签: c++ multithreading c++11

我想确保在对象被破坏之前完成一个线程。

这是我能想到的最基本的例子:

struct User {
    std::thread worker_thread;

    ~User() {
        if (worker_thread.joinable()) {
            worker_thread.join();
        }
    }
};

这是解决问题的正确方法吗?

2 个答案:

答案 0 :(得分:2)

这是不正确的,因为join()可能会抛出异常,并且您不希望任何异常转义任何析构函数。来自Herb Sutters Exceptional C++ Destructors Throw和为什么他们是邪恶的部分。

  

遵守规范的异常安全规则:永远不要允许异常从析构函数或重载的运算符delete()operator delete[]();中转义每个析构函数和释放函数,就好像它有一个异常规范“ throw()   。“

答案 1 :(得分:1)

我也认为评论中提到它很好,但你需要确保在需要时正确退出一个帖子。

例如,如果循环计数器缓慢倒计时,则需要在长等待队列之前正确关闭。当你有一个无休止的"布尔条件,例如必须切换,等等。