
242
|
第
7
章
哎呀,条款
39
会展示,使用
ThreadRAII
在
std::thread
析构中实施
join
不是仅仅会
导致性能异常那么简单,而是会导致程序失去响应。这种问题的“合适的”解决方案
是和异步执行的
lambda
式通信,当我们已经不再需要它运行,它应该提前返回,但
C++11
中并不支持这种可中断线程。我们可以手动实现它,但这个话题超出了本书的
范围。
注
3
条款
17
解释过,因为
ThreadRAII
声明了析构函数,所以不会有编译器生成的移动操
作,但这里
ThreadRAII
对象没有理由实现为不可移动的。如果编译器会生成这些函数,
这些函数的行为就是正确的,所以显式地请求创建它们是适当的:
class ThreadRAII {
public:
enum class DtorAction { join, detach };
//
同前
ThreadRAII(std::thread&& t, DtorAction a)
//
同前
: action(a), t(std::move(t)) {}
~ThreadRAII()
{
…
//
同前
}
ThreadRAII(ThreadRAII&&) = default;
//
支持
ThreadRAII& operator=(ThreadRAII&&) = default;
//
移动操作
std::thread& get() { return t; }
//
同前
private:
//