繁体   English   中英

C ++ 11相当于boost shared_mutex

[英]C++11 equivalent to boost shared_mutex

boost::shared_mutex是否有C ++ 11的等价物。 或者在C ++ 11中处理多个读者/单个写入者情况的另一个解决方案?

我试过但没能将shared_mutex变成C ++ 11。 已经提出了未来的标准。 提案就在这里

编辑 :C ++ 14 接受了修订版(N3659)。

这是一个实现:

http://howardhinnant.github.io/shared_mutex

http://howardhinnant.github.io/shared_mutex.cpp

简单......没有一个。 读写器锁没有标准的C ++实现。

但是,你有几个选择。

  1. 您可以使用自己的设备来制作自己的读者 - 作家锁。
  2. 如您所述,使用特定于平台的实现,例如Win32POSIXBoost
  3. 不要使用一个 - 使用C ++ 11中已存在的互斥锁

#1一起执行并实现自己的是一项可怕的任务,如果你没有做到正确的话,可以用竞争条件来捣乱你的代码。 有一个参考实现可以使工作更容易一些。

如果您想要与平台无关的代码,或者不希望在代码中包含任何额外的库,只需要像读写器锁一样简单,那么就可以从窗口中抛出#2

并且, #3有一些警告,大多数人都没有意识到:使用读写器锁定通常性能较差,并且与使用简单互斥锁的等效实现相比,具有更难以理解的代码。 这是因为必须在读者 - 作者锁定实现的幕后进行额外的簿记。


我只能向您展示您的选择,实际上您需要权衡每个选项的成本和收益,并选择最适合的选项。


编辑: C ++ 17现在有一个shared_mutex类型,适用于多个并发读取器的好处超过shared_mutex本身的性能成本的情况。

不,在C ++ 11中没有boost::shared_mutex等价物。

但是,在C ++ 14或更高版本中支持读/写锁:

不同之处在于std::shared_timed_mutex增加了额外的计时操作。 它实现了SharedTimedMutex概念 ,它是std::shared_mutex实现的更简单的TimedMutex概念的扩展。


请记住,获取读/写互斥锁的锁比获取普通的std::mutex 因此,如果您经常进行短读操作,则读/写互斥锁不会提高性能。 它更适合于读取操作频繁且昂贵的场景。 引用Anthony Williams的帖子

锁定shared_mutex的成本高于锁定普通std :: mutex的成本,即使对于读取器线程也是如此。 这是功能的必要部分--- shared_mutex的可能状态多于互斥锁,代码必须正确处理它们。 这个成本既包括对象的大小(在您的实现和我的POSIX实现中都包括普通的互斥锁和条件变量),以及锁定和解锁操作的性能。

此外,shared_mutex是一个争用点,因此不可扩展。 锁定shared_mutex必然会修改互斥锁的状态,即使对于读锁定也是如此。 因此,必须将保持shared_mutex状态的高速缓存行传送到执行锁定或解锁操作的任何处理器。

如果你有很多线程执行频繁的短读操作,那么在多处理器系统上这会导致很多缓存乒乓,这将对系统的性能产生很大影响。 在这种情况下,您可以采用仅使用普通互斥锁的简单设计,因为无论如何读者基本上都是序列化的。

如果读取不频繁,那么就没有争用,所以你不必担心并发读者,无论如何,普通的互斥量就足以满足那种情况。

如果读取操作是耗时的,则这种争用的后果不太明显,因为它与保持读取锁定所花费的时间相比相形见绌。 然而,在握住锁的同时执行耗时的操作是一种设计气味。

在绝大多数情况下,我认为有更好的替代方法可以使用shared_mutex。 这些可能是普通的互斥体,shared_ptr的原子支持,精心构造的并发容器的使用,或其他,取决于上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM