有人可以说出std::mutex
既不可复制又不可移动的原因吗?有人告诉我,这与避免资源浪费有些关系。为什么应该将std :: mutex的副本ctor标记为已删除?如果没有,是否有潜在的问题?
除了下面的答案,互斥体句柄也不能在OS级别复制。在Windows中,您必须创建一个命名的互斥体,然后基于该名称打开一个新的句柄,例如,该句柄打算在新的线程/进程中使用,而std :: mutex则永远不会创建命名的对象。因此,即使有一个复制构造函数,也将无法实现它。
通常,同步对象的语义与其他普通对象的语义不同,即使它们显然包装在C ++类中也是如此
std::mutex没有副本构造函数。如果发送副本,则每个副本都会锁定其自己的副本,并且您不会阻止竞争条件。帮助程序员不要自拔。
互斥对象有助于防止数据争用并允许 执行代理之间的数据安全同步(30.2.5)。一个 执行代理成功调用一个代理后便拥有一个互斥体 锁定功能,直到调用解锁为止。
如果您可以移动,那么所有权要求将被破坏。