为什么std :: mutex既不可复制又不可移动?为什么std :: mutex的复制ctor应该标记为已删除?如果不是,是否有任何潜在的问题?

问题描述 投票:0回答:2

有人可以说出std::mutex既不可复制又不可移动的原因吗?有人告诉我,这与避免资源浪费有些关系。为什么应该将std :: mutex的副本ctor标记为已删除?如果没有,是否有潜在的问题?

c++ c++11 constructor mutex copy-constructor
2个回答
1
投票

除了下面的答案,互斥体句柄也不能在OS级别复制。在Windows中,您必须创建一个命名的互斥体,然后基于该名称打开一个新的句柄,例如,该句柄打算在新的线程/进程中使用,而std :: mutex则永远不会创建命名的对象。因此,即使有一个复制构造函数,也将无法实现它。

通常,同步对象的语义与其他普通对象的语义不同,即使它们显然包装在C ++类中也是如此


1
投票

std::mutex没有副本构造函数。如果发送副本,则每个副本都会锁定其自己的副本,并且您不会阻止竞争条件。帮助程序员不要自拔。

30.4.1 Mutex requirements

互斥对象有助于防止数据争用并允许 执行代理之间的数据安全同步(30.2.5)。一个 执行代理成功调用一个代理后便拥有一个互斥体 锁定功能,直到调用解锁为止。

如果您可以移动,那么所有权要求将被破坏。

© www.soinside.com 2019 - 2024. All rights reserved.