-1

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

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

struct User {
    std::thread worker_thread;

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

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

4

2 回答 2

2

这是不正确的,因为join()可能会引发异常,并且您不想让任何异常逃脱任何析构函数。来自 Herb Sutters Exceptional C++Destructors That Throw 和 Why they're Evil 一节。

遵守规范的异常安全规则:永远不要让异常从析构函数或重载的运算符中逃逸,delete()或者operator delete[]();编写每个析构函数和释放函数,就好像它有一个异常规范“ throw() .”一样。

于 2013-08-23T20:35:21.223 回答
1

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

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

于 2013-08-23T20:29:22.970 回答