【问题标题】:Portable Writer-Readers spinlock便携式读写器自旋锁
【发布时间】:2016-06-22 02:38:06
【问题描述】:

我在 Writer-Readers 模型中使用 boost::shared_mutex 作为同步对象。但是,与不使用锁相比,它相当慢(在我的测试中:在没有任何读取器的情况下,写入 500,000 个值,如果不使用锁,则需要 100 毫秒,如果使用 boost::shared_mutex,则需要约 500 毫秒)。这就是为什么我决定考虑像自旋锁这样的东西。我想做一个便携式自旋锁(Windows + Linux)。

  1. 是否有任何我可以立即使用的 boost 包装器?
  2. This 是一个很好的主题,展示了如何在 Windows 上实现自旋锁。但我无法在 Linux 上找到类似的 Win32 API,例如 InterlockedCompareExchangeYieldProcessorInterlockedDecrement

2016 年 3 月 8 日更新

我发现了一个guide和facebook在github上发布的implementation。还没试过。我在这里更新了任何有相同问题并可能想要参考的人。

【问题讨论】:

  • 如果作者多于读者,使用共享互斥锁是愚蠢的。它们适用于您希望以使相对罕见的写入操作变慢为代价来使阅读器快速阅读的情况。尝试使用普通的互斥锁。
  • @DavidSchwartz 我只有 1 位作者和最多 16 位读者。
  • 那你为什么要关心它在没有读者的情况下的表现?!
  • 另外,不要遵循您链接到的文章中的建议。它的性能很差。例如,LockWriter 代码有:while(Lock & 0x7fffffff); return;。那太好了。如果存在争用,并且您确实进行了自旋,那么当您最终获得写锁并阻塞所有其他需要同步对象的线程并且您必须尽快执行时,您将带走所有错误预测分支的母亲并炸毁管道.完全错了。
  • @duong_dajgja 他建议只有当你有超线程时才重要,这是不正确的。但无论如何,关键是你永远不应该实现自己的同步原语,除非你有迫切需要和/或深入了解你的代码让 CPU 做什么。而且你不应该关心它们在不切实际的条件下的表现。

标签: c++ boost spinlock


【解决方案1】:
  1. C++03 没有可移植的解决方案,因为 C++03 没有内存模型,但您只需复制目标平台的 atomic_flag 实现即可非常轻松地实现它。

  2. 我对给定链接/教程的评论:应用程序员不应使用volatile,除非您访问不寻常的内存。我推荐this 和该主题的所有其他文章。应该有一个可供下载的现成库。不知道是不是只有C++11。

  3. 我假设您对多线程、同步和锁不是很有经验。无论你想达到什么目标,先走标准路线,如果你的表现不够,以后再回来。

【讨论】:

  • 你的假设是正确的。我是新手。我想我最好还是坚持共享互斥锁,先看看实际环境中的性能。谢谢楼主!
猜你喜欢
  • 2012-06-03
  • 1970-01-01
  • 2010-12-07
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2011-02-20
  • 2016-06-20
相关资源
最近更新 更多