我想知道并且需要可用于减少低级锁定的策略。
然而这里的问题是这不是服务器应用程序的新代码(包含数万行 C++ 代码),所以我不能只是重写整个事情。
我担心现在可能没有解决这个问题的方法(太晚了)。但是我想听听其他人使用过的好的模式。
现在有太多的锁而不是那么多的冲突,所以这是一个由偏执引起的硬件性能问题。
描述代码的最佳方式是将单线程代码突然加满锁。
最佳答案
为什么需要消除低级锁?你有死锁问题吗?你有性能问题吗?还是缩放问题?锁通常是争用的还是无争用的?
你用的是什么环境?例如,C++ 中的答案将与 Java 中的答案不同。例如。 Java 6 中的无竞争同步块(synchronized block)实际上在性能方面相对便宜,所以简单地升级你的 JRE 可能会让你解决你试图解决的任何问题。通过切换到不同的编译器或锁定库,在 C++ 中可能会有类似的性能提升。
通常,有几种策略可以让您减少获得的互斥锁数量。
首先,任何只能从单个线程访问的东西都不需要互斥锁。
其次,任何不可变的东西都是安全的,只要它是“安全发布的”(即以这样一种方式创建,即部分构造的对象永远不会对另一个线程可见)。
第三,大多数平台现在都支持原子写入——当需要保护的只是单个原始类型(包括指针)时,这会有所帮助。这些工作与数据库中的乐观锁定非常相似。您还可以使用原子写入创建无锁算法来替换更复杂的类型,包括 Map 实现。然而,除非你非常非常好,否则你最好借用别人的调试实现(java.util.concurrent 包包含很多很好的例子)——众所周知,在编写自己的算法时很容易不小心引入错误。
第四,扩大互斥锁的范围会有所帮助——或者简单地保持打开互斥锁更长时间,而不是不断地锁定和解锁它,或者锁定一个“更大”的项目——例如对象而不是它的一个属性.然而,这必须非常小心地进行;您可以通过这种方式轻松引入问题。
关于language-agnostic - 摆脱低级锁的技巧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/125743/