C ++ 11相当于提高shared_mutex(C++11 equivalent to boost

2019-07-18 04:40发布

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

Answer 1:

我尝试,但未能获得shared_mutex进入C ++ 11。 它已经提出了一个未来的标准。 该提案是在这里 。

编辑 :修订版(N3659) 已被接受为C ++ 14。

这是一个实现:

http://howardhinnant.github.io/shared_mutex

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



Answer 2:

简单......没有一个。 没有标准的C ++实现的一个读者的作家锁。

但是,你有几个选择这里。

  1. 你在你自己的设备留下来使自己的读者,作家锁。
  2. 使用特定于平台的实现,例如Win32的公司 , POSIX的 ,或升压转换器的你提到。
  3. 不要使用一个在所有-使用一个互斥体已经存在于C ++ 11。

#1和去实现自己的是一个可怕的任务,这是可能的谜语与种族的条件下使用的代码,如果你没有得到它的权利。 有一个基准实行 ,可能使这项工作更容易一点。

如果你想独立于平台的代码,或不希望在您的作为读写锁一样简单代码的任何额外的库,你可以扔掉#2窗外。

而且,#3,大多数人没有意识到需要注意几个问题:使用读写锁常常是少高性能,并拥有更难以理解的代码比使用一个简单的互斥体等效实现。 这是因为额外的簿记有去一个读者 - 写入器锁定实施的幕后。


我只能为您介绍您的选择,确实是由你来权衡各的成本和收益,并挑选其中效果最好。


编辑:C ++ 17现在有一个shared_mutex用于在具有多个并发读者的利益大于性能成本的情况下型shared_mutex本身。



Answer 3:

没有,有没有类似boost::shared_mutex在C ++ 11。

读/写锁被C ++ 14或更高版本的支持,虽然:

  • C ++ 14加入std::shared_timed_mutex
  • C ++ 17加入std::shared_mutex

不同的是, std::shared_timed_mutex增加了额外的定时操作。 它实现了SharedTimedMutex概念 ,这是简单的延伸TimedMutex概念,通过实施std::shared_mutex


请记住,获取锁的读/写互斥体是比获得一个正常的更昂贵std::mutex 。 因此,读/写互斥不会提高性能,如果你有频繁的,但短期的读操作。 这是更适合方案进行了读操作频繁且昂贵的。 要引述安东尼·威廉姆斯的职位 :

锁定shared_mutex的成本比锁定一个普通的std ::互斥量高,即使是读线程。 这是功能的必要组成部分---有一个shared_mutex不是互斥的更可能的状态,代码必须正确处理它们。 这种成本来自于对象(在您的实现和我的POSIX实现既包括普通互斥和条件变量)的两种尺寸,并且在锁的性能和解锁操作。

此外,shared_mutex是争论的焦点,因而不能扩展。 锁定shared_mutex必然改变互斥体的状态,即使是读锁。 因此,高速缓存行保持shared_mutex状态必须被转移到处理器为准正在执行锁定或解锁操作。

如果你有很多表演频繁而短暂的读取操作的线程,则多处理器系统上,这可能导致大量的缓存乒乓的,这将在很大程度上影响系统的性能。 在这种情况下,你可能也采取只使用一个简单的互斥体的简单的设计,因为读者基本上反正序列化。

如果读不频繁,那么就没有竞争,所以你不必担心并发读取,和一个普通的互斥无论如何都会足以为该场景。

如果读操作耗时,那么这个争论的结果是不太明显的,因为它是由花而持有读锁的时间相形见绌。 然而,虽然持有锁执行耗时的操作是一个设计的气味。

在绝大多数情况下,我认为有一个shared_mutex更好的替代品。 这可能是一个普通的互斥体,原子支持的shared_ptr,使用一个精心构造的并发容器,还是别的什么,这取决于上下文。



文章来源: C++11 equivalent to boost shared_mutex