非阻塞同步

互斥同步面临的主要问题是进行线程阻塞和唤醒所带来的性能开销。因此这种

同步也被称为阻塞同步(Blocking Synchronization)。从解决问题的方式看,

互斥同步属于一种悲观的并发策略。

非阻塞同步

基于冲突检测的乐观并发策略,先进行操作,如果没有其他线程争用共享数据,

那操作就直接成功;如果共享的数据确实被争用,产生了冲突,那再进行其他的

补偿措施,常用的补偿措施是不断地重试,直到没有出现竞争的共享数据为止。

这种乐观并发策略的实现不再需要把线程阻塞挂起,因此这种同步操作被称为

非阻塞同步(Non-Blocking Synchronization),使用这种措施的代码也常常

被称为无锁(Lock-Free)编程。

使用这种策略需要硬件指令集的支持。因为必须要求操作和冲突检测

这两个步骤具备原子性。这类指令有:

  • 测试并设置(Test-and-Set
  • 获取并增加(Fetch-and-Increment
  • 交换(Swap
  • 比较并交换(Compare-and-Swap,CAS
  • 加载链接/条件储存(Load-Linked / Store-Conditional,LL / SC

IA64X86指令集中有用cmpxchg指令完成CAS功能