【发布时间】:2016-06-22 02:38:06
【问题描述】:
我在 Writer-Readers 模型中使用 boost::shared_mutex 作为同步对象。但是,与不使用锁相比,它相当慢(在我的测试中:在没有任何读取器的情况下,写入 500,000 个值,如果不使用锁,则需要 100 毫秒,如果使用 boost::shared_mutex,则需要约 500 毫秒)。这就是为什么我决定考虑像自旋锁这样的东西。我想做一个便携式自旋锁(Windows + Linux)。
- 是否有任何我可以立即使用的 boost 包装器?
-
This 是一个很好的主题,展示了如何在 Windows 上实现自旋锁。但我无法在 Linux 上找到类似的 Win32 API,例如
InterlockedCompareExchange、YieldProcessor、InterlockedDecrement。
2016 年 3 月 8 日更新
我发现了一个guide和facebook在github上发布的implementation。还没试过。我在这里更新了任何有相同问题并可能想要参考的人。
【问题讨论】:
-
如果作者多于读者,使用共享互斥锁是愚蠢的。它们适用于您希望以使相对罕见的写入操作变慢为代价来使阅读器快速阅读的情况。尝试使用普通的互斥锁。
-
@DavidSchwartz 我只有 1 位作者和最多 16 位读者。
-
那你为什么要关心它在没有读者的情况下的表现?!
-
另外,不要遵循您链接到的文章中的建议。它的性能很差。例如,
LockWriter代码有:while(Lock & 0x7fffffff); return;。那太好了。如果存在争用,并且您确实进行了自旋,那么当您最终获得写锁并阻塞所有其他需要同步对象的线程并且您必须尽快执行时,您将带走所有错误预测分支的母亲并炸毁管道.完全错了。 -
@duong_dajgja 他建议只有当你有超线程时才重要,这是不正确的。但无论如何,关键是你永远不应该实现自己的同步原语,除非你有迫切需要和/或深入了解你的代码让 CPU 做什么。而且你不应该关心它们在不切实际的条件下的表现。