CAS

【本文链接】

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;
}

【参考】

http://coolshell.cn/articles/8239.html

http://blog.csdn.net/lifesider/article/details/6582338