C ++ 11相当于boost shared_mutex

时间:2013-01-13 18:36:32

标签: c++ boost c++11 mutex

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

3 个答案:

答案 0 :(得分:68)

我试过但未能将shared_mutex引入C ++ 11。已经提出了未来的标准。该提案为here

修改:C ++ 14的修订版(N3659)was accepted

这是一个实现:

http://howardhinnant.github.io/shared_mutex

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

答案 1 :(得分:18)

简单......没有一个。 readers-writer锁没有标准的C ++实现。

但是,你有几个选择。

  1. 您可以使用自己的设备来制作自己的读者 - 作家锁。
  2. 如您所述,使用特定于平台的实施,例如Win32'sPOSIX'sBoost's
  3. 根本不使用 - 使用C ++ 11中已存在的mutex
  4. 使用#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增加了额外的计时操作。它实现了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,使用精心构造的并发   容器或其他东西,取决于上下文。