非阻塞同步
互斥同步面临的主要问题是进行线程阻塞和唤醒所带来的性能开销。因此这种
同步也被称为阻塞同步(Blocking Synchronization
)。从解决问题的方式看,
互斥同步属于一种悲观的并发策略。
非阻塞同步
基于冲突检测的乐观并发策略,先进行操作,如果没有其他线程争用共享数据,
那操作就直接成功;如果共享的数据确实被争用,产生了冲突,那再进行其他的
补偿措施,常用的补偿措施是不断地重试,直到没有出现竞争的共享数据为止。
这种乐观并发策略的实现不再需要把线程阻塞挂起,因此这种同步操作被称为
非阻塞同步(Non-Blocking Synchronization
),使用这种措施的代码也常常
被称为无锁(Lock-Free
)编程。
使用这种策略需要硬件指令集的支持。因为必须要求操作和冲突检测
这两个步骤具备原子性。这类指令有:
- 测试并设置(
Test-and-Set
)- 获取并增加(
Fetch-and-Increment
)- 交换(
Swap
)- 比较并交换(
Compare-and-Swap,CAS
)- 加载链接/条件储存(
Load-Linked / Store-Conditional,LL / SC
)
在IA64
、X86
指令集中有用cmpxchg
指令完成CAS
功能