一、概念

      原子操作提供了指令原子执行,中间没有中断。就像原子被认为是不可分割颗粒一样,原子操作(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中原子操作实现方式

posted on 2017-05-26 16:20  amanlikethis  阅读(5292)  评论(0编辑  收藏  举报