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

std::thread in C++11, how to ensure a thread is finished inside a destructor

本文关键字:线程 确保 析构函数 何确保 C++11 std      更新时间:2023-10-16

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

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

struct User {
    std::thread worker_thread;
    ~User() {
        if (worker_thread.joinable()) {
            worker_thread.join();
        }
    }
};

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

这是不正确的,因为join()可能会抛出异常,并且您不想让任何异常逃离任何析构函数。Herb Sutters在Destructors That Throw and Why They are Evil一节中介绍了出色的C++

遵守规范的异常安全规则:永远不要允许异常从析构函数或重载运算符delete()operator delete[]();中转义。将每个析构函数和释放函数都写为"throw()"."

我也认为这很好,正如评论中提到的,但如果需要,您需要确保正确退出线程。

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