How*_*ant 69
我尝试但未能shared_mutex
进入C++ 11.已经提出了未来的标准.提案就在这里.
编辑:C++ 14 接受了修订版(N3659).
这是一个实现:
http://howardhinnant.github.io/shared_mutex
http://howardhinnant.github.io/shared_mutex.cpp
Sea*_*ine 18
简单......没有一个.读写器锁没有标准的C++实现.
但是,你有几个选择.
与#1一起执行并实现自己的是一项可怕的任务,如果你没有做到正确的话,可以用竞争条件来捣乱你的代码.有一个参考实现可以使工作更容易一些.
如果您想要与平台无关的代码,或者不希望在代码中包含任何额外的库以获得像读写器锁这样简单的东西,那么您可以在窗口中抛出#2.
并且,#3有一些注意事项,大多数人都没有意识到:使用读写器锁通常性能较差,并且与使用简单互斥锁的等效实现相比,具有更难以理解的代码.这是因为必须在读者 - 作者锁定实现的幕后进行额外的簿记.
我只能向您展示您的选择,实际上您需要权衡每个选项的成本和收益,并选择最适合的选项.
编辑:
C++ 17现在有一种shared_mutex
类型,适用于拥有多个并发读取器的好处超过其shared_mutex
自身的性能成本的情况.
不,boost::shared_mutex
在C++ 11中没有等价物.
但是,在C++ 14或更高版本中支持读/写锁:
std::shared_timed_mutex
std::shared_mutex
不同之处在于std::shared_timed_mutex
增加了额外的定时操作.它实现了SharedTimedMutex概念,它是由更简单的TimedMutex概念实现的std::shared_mutex
.
请记住,获取读/写互斥锁的锁定比获取正常锁定更昂贵std::mutex
.因此,如果您经常进行短读操作,则读/写互斥锁不会提高性能.它更适合于读取操作频繁且昂贵的场景.引用Anthony Williams的帖子:
锁定shared_mutex的成本高于锁定普通std :: mutex的成本,即使对于读取器线程也是如此.这是功能的必要部分--- shared_mutex的可能状态多于互斥锁,代码必须正确处理它们.这个成本既包括对象的大小(在您的实现和我的POSIX实现中都包括普通的互斥锁和条件变量),以及锁定和解锁操作的性能.
此外,shared_mutex是一个争用点,因此不可扩展.锁定shared_mutex必然会修改互斥锁的状态,即使对于读锁定也是如此.因此,保持shared_mutex状态的高速缓存行必须被转移到执行锁定或解锁操作的任何处理器.
如果你有很多线程执行频繁的短读操作,那么在多处理器系统上这会导致很多缓存乒乓,这将对系统的性能产生很大影响.在这种情况下,您可以采用仅使用普通互斥锁的简单设计,因为无论如何读者基本上都是序列化的.
如果读取不频繁,那么就没有争用,所以你不必担心并发读者,无论如何,普通的互斥量就足以满足那种情况.
如果读取操作是耗时的,则这种争用的后果不太明显,因为它与保持读取锁定所花费的时间相比相形见绌.然而,在握住锁的同时执行耗时的操作是一种设计气味.
在绝大多数情况下,我认为有更好的替代方法可以使用shared_mutex.这些可能是普通的互斥体,shared_ptr的原子支持,精心构造的并发容器的使用,或其他,取决于上下文.
归档时间: |
|
查看次数: |
20162 次 |
最近记录: |