我想确保在破坏对象之前完成线程。
这是我能想到的最基本的例子:
struct User {
std::thread worker_thread;
~User() {
if (worker_thread.joinable()) {
worker_thread.join();
}
}
};
这是解决问题的正确方法吗?
我想确保在破坏对象之前完成线程。
这是我能想到的最基本的例子:
struct User {
std::thread worker_thread;
~User() {
if (worker_thread.joinable()) {
worker_thread.join();
}
}
};
这是解决问题的正确方法吗?
这是不正确的,因为join()
可能会引发异常,并且您不想让任何异常逃脱任何析构函数。来自 Herb Sutters Exceptional C++的Destructors That Throw 和 Why they're Evil 一节。:
遵守规范的异常安全规则:永远不要让异常从析构函数或重载的运算符中逃逸,
delete()
或者operator delete[]();
编写每个析构函数和释放函数,就好像它有一个异常规范“throw()
.”一样。
我也认为评论中提到的很好,但是如果需要,您需要确保正确退出线程。
例如,如果您的循环计数器倒计时缓慢,则需要在长等待队列之前正确关闭。更重要的是,当您有一个“无尽的”布尔条件时,例如必须切换等等。