我是靠谱客的博主 追寻钢铁侠,这篇文章主要介绍linux系统原子操作,现在分享给大家,希望可以做个参考。

一、概念

      原子操作提供了指令原子执行,中间没有中断。就像原子被认为是不可分割颗粒一样,原子操作(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系统原子操作的全部内容,更多相关linux系统原子操作内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部