在C++ and Beyond 2012: Herb Sutter - C++ Concurrency中40:30时,Herb Sutter根据他的包装器成语显示了一个监视器类:
template<typename T>
class monitor {
private:
mutable T t;
mutable std::mutex m;
public:
monitor(T t_ = T{}) : t{t_} {}
template<typename F>
auto operator()(F f) const -> decltype(f(t))
{
std::lock_guard<mutex> _{m}; return f(t);
}
}
请注意,构造函数接受
T
而不是T&
或T&&
,并且都不包含任何构造函数。我想象的用例是:monitor<Foo> foo = Foo(...);
由于缺少移动构造函数而失败。
最佳答案
Sutter的示例中的构造函数采用T
而不是T &
或T&&
,因为值语义是C++中的默认语义,并且:
T
。 (有时可能会-但显然不在此讨论中)。 T&
-这意味着其他人将无需访问监控器即可访问受监视的数据,即无需获取锁,即无需序列化访问权限...