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&-这意味着其他人将无需访问监控器即可访问受监视的数据,即无需获取锁,即无需序列化访问权限...
  • 09-13 13:37