zoukankan      html  css  js  c++  java
  • 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中原子操作实现方式

  • 相关阅读:
    .NET CF 枚举设备窗口
    .NET CF WM设备(手机)振动
    如何将 byte[] 转换为 IntPtr?
    Mobile 重启设备
    如何删除只读文件?
    随笔
    故乡的原风景
    岁月神偷
    opengl纹理映射
    bootstrap 学习笔记
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/6909168.html
Copyright © 2011-2022 走看看