码迷,mamicode.com
首页 > 系统相关 > 详细

linux系统原子操作

时间:2017-05-26 16:38:26      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:读取   单元   span   strong   lan   amp   语言   pos   tle   

一、概念

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

linux系统原子操作

标签:读取   单元   span   strong   lan   amp   语言   pos   tle   

原文地址:http://www.cnblogs.com/amanlikethis/p/6909168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!