C++ C++;11相当于增强共享互斥
对于C++ C++;11相当于增强共享互斥,c++,boost,c++11,mutex,C++,Boost,C++11,Mutex,对于boost::shared_mutex,是否有C++11等价物。或者另一种解决方案来处理C++11中的多读/单写器情况?简单。。。没有。没有标准的C++实现锁。 但是,你有几个选择 您只能使用自己的设备来锁定自己的读写器 使用特定于平台的实现,如或您提到的 一点也不要使用——使用C++11中已经存在的 使用#1并实现您自己的是一项可怕的任务,如果您没有正确理解,您可能会用竞争条件来迷惑代码。有一种方法可以使这项工作容易一点 如果您想要独立于平台的代码,或者不想在代码中包含任何额外的库,比如读
boost::shared_mutex
,是否有C++11等价物。或者另一种解决方案来处理C++11中的多读/单写器情况?简单。。。没有。没有标准的C++实现锁。
但是,你有几个选择
我只能向你介绍你的选择,实际上,这取决于你权衡每种选择的成本和收益,并选择哪种效果最好
编辑:
C++17现在有一种类型,适用于具有多个并发读卡器的好处大于
共享互斥体本身的性能成本的情况。我尝试将共享互斥体
导入C++11,但失败。它被提议作为未来的标准。这项建议是正确的
编辑:C++14的修订版(N3659)
下面是一个实现:
不,在C++11中没有与之等价的boost::shared_mutex
C++14或更高版本支持读/写锁,但:
- 添加了C++14
- 添加了C++17
不同之处在于std::shared_timed_mutex
添加了额外的定时操作。它实现了,这是由std::shared_mutex
实现的simpler的扩展
请记住,获取读/写互斥锁比获取普通互斥锁的成本更高。因此,如果执行频繁但较短的读取操作,读/写互斥锁将不会提高性能。它更适合于读操作频繁且昂贵的场景。引自:
锁定共享_互斥体的成本高于锁定共享_互斥体的成本
普通std::互斥,即使对于读线程也是如此。这是一个必要的部分
功能性——一个系统有更多可能的状态
shared_mutex比mutex更有效,代码必须正确处理它们。这
成本来自对象的大小(在您的
实现和我的POSIX实现都包括一个普通互斥锁
和一个条件变量),以及锁定和解锁的性能
行动
此外,共享互斥体是一个争用点,因此不是
可伸缩。锁定共享_互斥体必然会修改
互斥锁,即使是读锁。因此,保存
共享互斥体状态必须传输到指定的处理器
执行锁定或解锁操作
如果有很多线程执行频繁的短读操作,
然后在多处理器系统上,这会导致大量缓存
乒乓球,这将极大地影响运动员的表现
系统。在这种情况下,您也可以采用更简单的设计
使用普通互斥,因为读卡器本质上是序列化的
如果读取不频繁,则不存在争用,因此您不需要
需要担心并发读卡器,一个简单的互斥就足够了
不管怎样,在这种情况下
如果读取操作非常耗时,那么
争论是不太明显的,因为它是相形见绌的时间花在
保持读锁。但是,执行耗时的操作
同时持有锁是一种设计气味
在绝大多数情况下,我认为有更好的方法
共享互斥的替代方案。这些可能是一个简单的互斥体,即原子互斥体
支持共享的ptr,使用精心构造的并发
容器或其他内容,具体取决于上下文
boost::shared_mutex
被标准化委员会拒绝。这可能是相关的:@AndyProwl:我支持Nawaz的观点。我同意共享锁不是一个很好的解决方案,因为您可以在一小段时间内保持锁。但这并不总是可能的。如果是这样的话,共享锁定在这么多的库和语言中就不会那么普遍了。特别是,我发现“在持有锁的同时进行耗时的操作是一种设计上的气味”完全不能令人信服。要么“设计气味”意味着“一些永远不会发生的事情”,在这种情况下,它肯定是错误的输入法(考虑到“足以避免严重的缓存乒乓”并不是需要花费很多时间),要么“设计气味”意味着“一个令人担忧的信号,表明可能存在问题,但在某些情况下仍然是必要的”,在这种情况下,为什么要通过从提案中删除rwlock来撤销对这些情况的支持?@Nawaz:但这只是一个论点,即存在rwlock并不比互斥更好的情况(在其他地方,Willams解释了为什么有时更糟糕)。这是真的,但这不是移除RWlock的好理由。您不妨删除向量
,因为有时候deque
更好。我不是说委员会没有充分的理由不包括共享互斥,只是这个解释不是(我希望)