boost::shared_mutex
是否存在C ++ 11等价物。或者在C ++ 11中处理多个读者/单个写入者情况的另一个解决方案?
答案 0 :(得分:68)
我试过但未能将shared_mutex
引入C ++ 11。已经提出了未来的标准。该提案为here。
修改:C ++ 14的修订版(N3659)was accepted。
这是一个实现:
答案 1 :(得分:18)
简单......没有一个。 readers-writer锁没有标准的C ++实现。
但是,你有几个选择。
使用#1 并实施自己的操作是一件非常可怕的事情,如果你没有把它弄好,可以用竞争条件来捣乱你的代码。有一个reference implemenation可以使这项工作更轻松。
如果您想要与平台无关的代码,或者不希望在代码中包含任何额外的库,只需要像读写器锁一样简单,就可以将#2 抛出窗口。< / p>
并且,#3 有一些警告,大多数人都没有意识到:使用读写器锁通常性能较差,并且具有比同等实现更难以理解的代码使用简单的互斥锁。这是因为必须在读者 - 作家锁实现的幕后进行额外的簿记。
我只能向您展示您的选择,实际上您需要权衡每个选项的成本和收益,并选择最适合的选项。
修改强>
C ++ 17现在具有shared_mutex
类型,适用于具有多个并发读取器的好处超过shared_mutex
本身的性能成本的情况。
答案 2 :(得分:6)
不,C ++ 11中没有boost::shared_mutex
的等价物。
C ++ 14或更高版本支持读/写锁:
std::shared_timed_mutex
std::shared_mutex
不同之处在于std::shared_timed_mutex
增加了额外的计时操作。它实现了SharedTimedMutex concept,它是std::shared_mutex
实现的更简单TimedMutex concept的扩展。
请记住,获取读/写互斥锁的锁定比获取正常std::mutex
更昂贵。因此,如果您经常进行短读操作,则读/写互斥锁不会提高性能。它更适合于读取操作频繁且昂贵的场景。引用Anthony Williams' post:
锁定shared_mutex的成本高于锁定a的成本 plain std :: mutex,即使是读者线程。这是必要的部分 功能性 - 有更多可能的状态 shared_mutex而不是互斥锁,代码必须正确处理它们。这个 成本来自于对象的大小(在你的两个中都有) 实现和我的POSIX实现包括一个普通的互斥锁 和一个条件变量),并在执行锁定和解锁 操作
此外,shared_mutex是一个争用点,因此不是 可扩展性。锁定shared_mutex必然会修改。的状态 互斥锁,即使是读锁定。因此,缓存行保持 shared_mutex状态必须转移到任何处理器 执行锁定或解锁操作。
如果你有很多线程执行频繁的短读操作, 然后在多处理器系统上,这会导致大量缓存 乒乓球,这将对乒乓球的表现产生重大影响 系统。在这种情况下,您可以采用更简单的设计 使用普通的互斥体,因为读者基本上都是序列化的。
如果不经常阅读,则没有争用,所以你不要 需要担心并发读者,而普通的互斥量就足够了 无论如何,对于那种情况。
如果读取操作很耗时,那么结果就是这样 争论不太明显,因为它花费的时间相形见绌 拿着读锁。但是,执行耗时的操作 拿着锁是一种设计气味。
在绝大多数情况下,我认为有更好的 shared_mutex的替代品。这些可能是普通的互斥体,即原子 支持shared_ptr,使用精心构造的并发 容器或其他东西,取决于上下文。