硬件同步原语
CAS
先比较,再交换。- 比较一下变量p当前的值是不是等于old,如果等于,就把变量p赋值为new,并返回true,否则就不改变变量p,并返回false。
<< atomic >>
function cas(p : pointer to int, old : int, new : int) returns bool {
if *p ≠ old {
return false
}
*p ← new
return true
}
FAA
先获取变量p的当前值value,然后给变量p增加inc,最后返回变量p之前的值value。
<< atomic >>
function faa(p : pointer to int, inc : int) returns int {
int value <- *location
*p <- value + inc
return value
}
上面的这两段伪代码,如果我们用编程语言来实现,肯定是无法保证原子性的。而原语的特殊之处就是,它们都是由计算机硬件,具体说就是 CPU 提供的实现,可以保证操作的原子性
。