一、概念
原子操作提供了指令原子执行,中间没有中断。就像原子被认为是不可分割颗粒一样,原子操作(atomic operation)是不可分割的操作。
c语言中一个变量的自加1操作,看起来很简单,好像只需要一条指令而不被打断。但这个操作实现起来,CPU的执行是有一个过程的,分为读取到寄存器,寄存器数学运算,回写到内存。这个实际情况,会给我们程序编写时带来隐患,举例来说明。
Thread 1 Thread 2
---------------------------------------------
get i (7) get i (7)
increment i (7->8)
--- increment i (7->8)
write back i (8) ----
--- write back i (8)
可以看到,不通的进程对同一个变量,自加1操作了两次,但是得到的结果,却是只自加1了一次,这种结果不是我们预先想要的。如果有一种方法,让对这个变量的读取、计算、回写整个过程,不被别的进程所打断,那么情况会好很多:
Thread 1 Thread 2
--------------------------------------------------------
get, increment, and store i(7->8) ---
--- get, increment, and store i(8->9)
或者:
Thread 1 Thread 2
--------------------------------------------------------
--- get, increment, and store i(7->8)
get, increment, and store i(8->9) ---
这种操作就是原子操作,利用一种独占内存的实现策略,这当然需要CPU的指令集提供这样的锁内存单元操作。
二、使用方法
1、定义一个原子变量,并初始化
atomic_t v = ATOMIC_INIT(0);
2、原子变量自减1
atomic_dec(&v);
3、原子变量自加1
atomic_inc(&v);
4、读取原子变量的值
atomic_read(&v);
5、原子变量自减1,并与0比较,如果为0则返回true,否则返回false
atomic_dec_and_test(&v);
参考资料:linux中原子操作实现方式