用于c ++ 11线程的RW锁

时间:2013-05-27 13:36:57

标签: c++ multithreading c++11

我想使用新的标准线程而不是boost:threads但我注意到旧的shared_mutex不可用。什么是一个很好的建议来取代这个功能,并给我一个多读者,单作家锁?

2 个答案:

答案 0 :(得分:23)

std::shared_mutex将成为C ++ 14标准库的一部分。它只是因为没有时间制定提案并彻底讨论它而没有进入C ++ 11。

您仍然可以使用boost::shared_mutex。在Windows下,如果您使用的是Windows Vista或更高版本,则可以使用Slim Read-Write Locks,它们针对速度和内存消耗进行了优化。

答案 1 :(得分:14)

您应该查看堆栈溢出问题“C++11 equivalent to boost shared_mutex”,特别是以下链接的电子邮件会话:http://permalink.gmane.org/gmane.comp.lib.boost.devel/211180(这解释了C ++ 11委员会对批准shared_mutex的抵制情况)。以下是关于Joe Duffy博客的实验:http://www.bluebytesoftware.com/blog/2009/02/12/ReaderwriterLocksAndTheirLackOfApplicabilityToFinegrainedSynchronization.aspx

每次考虑读/写锁时,请问自己以下6个问题。如果你能对其中任何一个回答“否”,那么读者/作者锁会使你的程序变得更糟,而不是更好。

  1. 我的共享对象是const吗?在我的生活中,我发现shared_mutex使用的错误比正确用途更多。要正确使用shared_mutex必须,您可以在阅读器关键部分内声明共享对象const,而无需任何编译器投诉。 “消费者”等同于“完全没有改变数据结构的人。”
  2. 我的关键部分真的很长吗?锁定shared_mutex 比锁定常规互斥锁更昂贵。您必须在关键部分中进行批次工作,以弥补锁定获取/释放的增加的开销。
  3. 我的关键部分应该那么长吗?您应该问问自己,您是否真的需要在关键部分完成所有工作。通常有一堆准备工作和/或工作来按摩围绕const调用共享对象的返回对象。从第一次使用共享对象到最后一次使用共享对象的数据依赖路径上的大部分额外工作都可以移到临界区之外。
  4. 锁定争用真的是我的性能问题吗?即使你的关键部分很长,你也应该绝对确定锁争用确实是你的性能问题。如果您没有遇到明显的锁定争用,那么切换到读取器/写入器锁定不会给您带来任何好处。
  5. 我可以通过切换到更精细的锁定方案来减少锁定争用吗?您是否使用单个锁来保护多个对象?你能给每个对象一个自己的锁吗?
  6. 读者与作者的比例是否显着大于1:1?即使您的关键部分很长并且锁争用是一个严重的问题,读者与编写者的比例也需要非常高才能从读取器/写入器锁中获得任何好处。数量取决于硬件上的原子指令的成本以及特定实现的质量。 (Joe Duffy发现,在他的机器上,他需要一个大约20:1的读者比例:作家让读者/作者锁定胜利。)