同步锁的类型

1)lock-free  算法

Lock-free 算法一般比基于锁的算法要好: 缓存

  • 从其定义来看,它们是 wait-free 的,能够确保线程永远不会阻塞。
  • 状态转变是原子性的,以致于在任何点失败都不会恶化数据结构。
  • 由于线程永远不会阻塞,因此当同步的细粒度是单一原子写或比较交换时,它们一般能够带来更高的吞吐量。
  • 在某些状况下,lock-free 算法会有更少的同步写操做(好比 Interlocked 操做),所以纯粹从性能来看,它可能更便宜。

可是 lock-freedom 并非万能药。下面是一些很明显的不利因素: 数据结构

  • 乐观的并发使用会对 hot data structures 致使 livelock。
  • 代码须要大量困难的测试。一般其正确性取决于对目标机器内存模型的正确解释。
  • 基于众多缘由,lock-free 代码很难编写和维护

2) CAS: 架构

    CAS的原理是,将旧值与一个指望值进行比较,若是相等,则更新旧值
并发

     CAS 的原子性彻底取决于硬件实现。大多数 Intel 和 AMD 的 CPU 采用了一种叫作 MOSEI 缓存一致性协议来管理缓存。这种架构下,处理器缓存内 CAS 操做相对成本低廉。但一旦资源争用,就会引发缓存失效和总线占用。缓存越失效,总线越被占用,完成 CAS 操做也越被延迟。缓存争用是程序可伸缩性杀手。固然对于非 CAS 内存操做来讲也是如此,但 CAS 状况更加槽糕。 dom

  • CAS 操做要比普通内存操做花费更多 CPU 周期。这归功于缓存分级的额外负担、刷新写缓冲区与穿越内存栅栏限制和需求以及编译器对 CAS 操做优化的能力。
  • CAS 常常被用在优化并行操做上。这意味着 CAS 操做失败将致使从新尝试某些指令(典型的回滚操做)。即使没有任何争用,它也会作一些无用功。不论成功或失败都会增长争用的风险。

3)fetchandadd 性能

原子队列等则被证实不足以良好的同步两个以上的线程 测试

4) pthread_lock: fetch

当多个控制线程共享相同的内存时,须要确保每个线程看到一致数据视图。若是不存在读取数据或者全部数据只读时不会存在一致性问题。若是某个线程正在修改变量而其余线程也能够读取或者修改这个变量的时候就须要对这些线程进行同步。在变量修改多于一个存储器访问周期时可能出现不一致的错误 优化

相关文章
相关标签/搜索