【本文链接】
http://www.cnblogs.com/hellogiser/p/compare-and-swap.html
CAS(compare and swap)操作实现
【分析】
当同时存在读写线程时,默认情况下是不保证线程安全的,因而需要利用信号量来进行线程同步(Synchronization),如关键代码段、互斥体等,同时操作系统也提供了相应的API。然而同步并不总是满足条件的且有效率的,比如陷入内核时会有性能损失、死锁、活锁以及资源浪费等。
于是Lock-Free和Wait-Free的思想出现了,由于此时不存在读写线程的同步,因而在写线程运行时,读线程也在运行(多核中两个线程在不同的核上被调度运行),而且代码量减少,程序运行更快。而这一思想是通过CAS机制来实现。
Compare & Set,或是 Compare & Swap,现在几乎所有的CPU指令都支持CAS的原子操作,X86下对应的是 CMPXCHG 汇编指令。有了这个原子操作,我们就可以用其来实现各种无锁(lock free)的数据结构。
【代码1】
这个操作用C语言来描述就是下面这个样子:(代码来自Wikipedia的Compare And Swap词条)意思就是说,看一看内存*reg里的值是不是oldval,如果是的话,则对其赋值newval。
C++ Code
1
2 3 4 5 6 7 |
int compare_and_swap (int *reg, int oldval, int newval)
{ int old_reg_val = *reg; if (old_reg_val == oldval) *reg = newval; return old_reg_val; } |
【代码2】
这个操作可以变种为返回bool值的形式(返回 bool值的好处在于,可以调用者知道有没有更新成功)
C++ Code
1
2 3 4 5 6 7 8 9 |
bool compare_and_swap (int *accum, int *dest, int newval)
{ if ( *accum == *dest ) { *dest = newval; return true; } return false; } |
【参考】