原子操作
-
TAS:Test and Set,写值到某个内存位置并传回其旧值。汇编指令BST
-
CAS: Compare and Swap,操作过程:将内存位置V的值与A比较(compare),如果相等,则说明没有其它线程来修改过这个值,所以把内存V的的值更新成B(swap),如果不相等,说明V上的值被修改过了,不更新,而是返回当前V的值,再重新执行一次任务再继续这个过程。会存在ABA问题。
bool compare_and_swap ( int *memory_location, int expected_value, int new_value) { if (*memory_location == expected_value) { *memory_location = new_value; return true; } return false; }
-
FAA: Fetch And Add,一般用来对变量做 +1 的原子操作
互斥锁的实现
信号量的实现
当信号量为一个二值信号量时,则退化为互斥锁的作用。
- 初始化,给与它一个非负数的整数值。
- 运行P(wait()),信号量S的值将被减少。企图进入临界区段的进程,需要先运行P(wait())。当信号量S减为负值时,进程会被挡住,不能继续;当信号量S不为负值时,进程可以获准进入临界区段。
- 运行V(signal()),信号量S的值会被增加。结束离开临界区段的进程,将会运行V(signal())。当信号量S不为负值时,先前被挡住的其他进程,将可获准进入临界区段。
其中对于信号量sem的操作过程应该是原子操作。