Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 消除低级别锁定的技术_Language Agnostic_Design Patterns_Locking - Fatal编程技术网

Language agnostic 消除低级别锁定的技术

Language agnostic 消除低级别锁定的技术,language-agnostic,design-patterns,locking,Language Agnostic,Design Patterns,Locking,我想知道,也需要一些策略来减少低级锁定。 然而,这里的捕获是,这不是一个新的代码(有成千上万的C++代码行),所以我不能重写整个东西。 我担心到目前为止这个问题可能还没有解决办法(太晚了)。然而,我想听听其他人使用的好模式 现在有太多的锁,而没有那么多的冲突,所以这是一个偏执导致的硬件性能问题。 最好的描述代码的方法是单线程代码突然被锁定。在编写一行代码之前,必须确定程序的线程模型。任何模块,如果与程序的其余部分不一致,都可能导致应用程序崩溃、损坏或死锁 如果你有机会重新开始,试着确定你的程序中

我想知道,也需要一些策略来减少低级锁定。 然而,这里的捕获是,这不是一个新的代码(有成千上万的C++代码行),所以我不能重写整个东西。 我担心到目前为止这个问题可能还没有解决办法(太晚了)。然而,我想听听其他人使用的好模式

现在有太多的锁,而没有那么多的冲突,所以这是一个偏执导致的硬件性能问题。
最好的描述代码的方法是单线程代码突然被锁定。

在编写一行代码之前,必须确定程序的线程模型。任何模块,如果与程序的其余部分不一致,都可能导致应用程序崩溃、损坏或死锁


如果你有机会重新开始,试着确定你的程序中可以并行完成的大型功能,并使用线程池来安排任务。提高效率的诀窍是尽可能避免互斥,并(重新)编码应用程序以避免在高级别争夺资源。

为什么需要消除低级别锁定?你有死锁问题吗?您有性能问题吗?还是规模问题?锁通常是争用的还是非争用的

您使用的是什么环境?例如,C++中的答案将不同于java中的答案。例如,Java 6中的无争用同步块实际上在性能方面相对便宜,因此简单地升级JRE可能会让您克服您试图解决的任何问题。在C++中,通过切换到不同的编译器或锁定库,可能会有类似的性能提升。 一般来说,有几种策略允许您减少获得的互斥量

首先,仅从单个线程访问的任何内容都不需要互斥

第二,任何不可变的东西都是安全的,只要它是“安全发布的”(即,以这样的方式创建,部分构造的对象对另一个线程永远不可见)

第三,大多数平台现在都支持原子写操作——当只需要保护一个基元类型(包括指针)时,这会有所帮助。这些操作与数据库中的乐观锁定非常相似。您还可以使用原子写入来创建无锁算法,以替换更复杂的类型,包括映射实现。但是,除非您非常非常优秀,否则最好借用其他人调试过的实现(java.util.concurrent包中包含许多好的示例)——众所周知,在编写自己的算法时,很容易意外地引入错误


第四,扩大互斥对象的范围可以有所帮助——比如,只需长时间保持打开互斥对象,而不是一直锁定和解锁互斥对象,或者锁定一个“较大”的项目——对象而不是其属性之一。然而,这必须非常小心地进行;通过这种方式,您可以很容易地引入问题。

在寻找无显式锁的原子更新共享状态的方法时,您可能会发现一些答案和帮助。

问题是CPU浪费了获取和释放锁,还是对某些锁的争用过多?低级别?与粗粒度一样,这是桌面应用程序还是web解决方案?为什么有这么多锁?