std::mutex
不能复制只是因为标准是这样说的。他们可能写了一个std::mutex
可复制的,但他们决定不这样做。
作为一种猜测,不可复制的std::mutex
可能更有效、更安全或更容易理解。
例如,这就是为什么它可能更安全/更容易理解的原因:复制std::mutex
被锁定的对象是什么意思?我个人不知道正确答案是什么;我怀疑正确的答案是“那是胡说八道”。没有“最不意外的答案”。
通过阻止复制,我们没有在并发代码中得到令人惊讶的答案,而是避免了这个问题。想要复制的存储互斥锁的人必须自己决定他们想要它做什么。
C++ 在某些情况下会自动生成一个复制构造函数。在更多的情况下,它会让你MyClass(MyClass const&)=default
在你要求的时候做和写一个。
如果你的类包含一个不可复制的类,它不会生成一个,你也不能要求它。这是因为生成的复制构造函数基本上复制了它的成员;如果你不能复制一个成员,它就不能生成一个复制构造函数。
所以mutex
不能复制,因为标准是这样说的。
如果结构或类包含不可复制的成员,则不能使用默认的复制构造函数。你必须自己明确地写一个。
如果您的类型需要存储 a mutex
,一种避免必须维护手动复制其所有其他成员的复制 ctor 的麻烦的方法是将您的非mutex
状态粘贴到子结构中,然后使用其默认副本。然后,您决定mutex
在复制期间如何处理 ,并且您的复制 ctor(和赋值复制运算符)保持简单。
struct bob_with_mutex {
sturct bob_simple_data {
int x, y, z;
std::vector<char> buff;
};
bob_simple_data data;
std::mutex m;
bob_with_mutex( bob_with_mutex const& o ):
data(o.data)
{}
bob_with_mutex& operator=( bob_with_mutex const& o )
{
data = o.data;
return *this;
}
};
该类型bob
混合了互斥锁和一些数据。数据存储在子结构中。的复制 ctorbob_with_mutex
不能默认,但它只是说“复制数据,仅此而已”。
的副本bob
有自己的互斥锁。