相当于c++ 11中的boost shared_mutex
C++11 equivalent to boost shared_mutex
是否有一个c++ 11等效的boost::shared_mutex
。或者在c++ 11中处理多个读取器/单个写入器情况的另一种解决方案?
我尝试但未能获得shared_mutex
进入c++ 11。它已被提议作为未来的标准。提案在这里。
Edit: c++ 14的修订版本(N3659)已被接受。
下面是一个实现:
http://howardhinnant.github.io/shared_mutex http://howardhinnant.github.io/shared_mutex.cpp简单…没有。没有标准的c++实现读写锁。
但是,这里有几个选项。
- 你可以在自己的设备上设置你自己的读写锁。
- 使用特定平台的实现,如Win32的,POSIX的,或Boost的,如你提到的。
- 不要使用互斥锁——使用c++ 11中已经存在的互斥锁。
使用#1并实现你自己的是一项可怕的任务,如果你做得不对,可能会让你的代码充满竞争条件。有一个参考实现可以使工作更容易一些。
如果你想要平台无关的代码,或者不想在代码中包含任何额外的库,比如读写锁,你可以把#2扔出窗外。
并且,#3有一些大多数人没有意识到的注意事项:使用读写锁通常性能较差,并且与使用简单互斥锁的等效实现相比,代码更难以理解。这是因为在读写锁实现的幕后必须进行额外的簿记。
我只能给你你的选择,真的是由你来权衡每一个的成本和收益,选择一个最好的。
编辑:
c++ 17现在有了shared_mutex
类型,用于具有多个并发读取器的好处超过shared_mutex
本身的性能成本的情况。
不,c++ 11中没有相应的boost::shared_mutex
。
在c++ 14或更高版本中支持读写锁,但是:
- c++ 14新增
std::shared_timed_mutex
- c++ 17新增
std::shared_mutex
区别在于std::shared_timed_mutex
增加了额外的计时操作。它实现了SharedTimedMutex概念,这是std::shared_mutex
实现的更简单的TimedMutex概念的扩展。
请记住,获取读/写互斥锁的代价要比获取普通的std::mutex
高。因此,如果有频繁的短读操作,读/写互斥锁不会提高性能。它更适合于读取操作频繁且代价昂贵的场景。引用Anthony Williams的帖子:
锁shared_mutex的代价比锁a的代价高普通的std::互斥锁,即使对于读线程也是如此。这是一个必要的部分有更多可能的a的状态Shared_mutex不是互斥锁,代码必须正确处理它们。这成本来自于对象的大小(这在你的实现和我的POSIX实现都包括一个普通互斥锁和一个条件变量),以及在性能上的锁和锁操作。
而且,shared_mutex是一个争用点,因此不是可伸缩的。锁定shared_mutex必须修改对象的状态互斥锁,即使是读锁。因此,保存Shared_mutex状态必须转移到任何处理器执行锁定或解锁操作。
如果你有很多线程执行频繁的短读操作,在多处理器系统上,这会导致大量缓存乒乓球,这将大大影响性能系统。在这种情况下,您不妨采用更简单的just的设计使用普通互斥锁,因为读取器基本上是序列化的。
如果读不频繁,则没有争用,所以不使用需要担心并发读取,一个普通互斥就足够了
如果读操作耗时,则此结果争论不太明显,因为它与花费的时间相比是微不足道的持有读锁。但是,执行耗时的操作而拿着锁是一种设计的味道。
在绝大多数情况下,我认为有更好的shared_mutex的替代方案。这可能是一个普通的互斥,原子支持shared_ptr,使用精心构造的并发容器,或其他东西,取决于上下文。
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- std::mutex 如何防止线程修改?
- 引用 std::shared:ptr 以避免引用计数
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- std::atomic 和 std::mutex 的相对性能
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- 当"std::lock_guard<std::mutex>"对象没有名称时的不同行为
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 使用 std::mutex 保护环路
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- std::mutex作为一个成员变量对多个线程来说是安全的吗
- 无法使用 libtool 将 -shared 参数传递给 g++
- std::shared_timed_mutex何时比std::mutex慢,以及何时(不)使用它
- <mutex> 使用 /clr 或 /clr:pure 编译时不支持
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 死锁使用 std::mutex 来保护多个线程中的 cout