zoukankan      html  css  js  c++  java
  • 原子变量

    原子变量使用原子API进行操作。
    所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念。
      原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。
      原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的。原子类型定义如下:
    typedef struct
     {
     volatile int counter;
     }
     atomic_t; 
     

      volatile修饰字段告诉gcc不要对该类型的数据做优化处理,对它的访问都是对内存的访问,而不是对寄存器的访问。
      原子操作API包括:
     
      该函数对原子类型的变量进行原子读操作,它返回原子类型的变量v的值。
    atomic_read(atomic_t * v); 
     
      该函数设置原子类型的变量v的值为i。
    atomic_set(atomic_t * v, int i); 
     
      该函数给原子类型的变量v增加值i。
    void atomic_add(int i, atomic_t *v); 
     
      该函数从原子类型的变量v中减去i。
    atomic_sub(int i, atomic_t *v);

      该函数从原子类型的变量v中减去i,并判断结果是否为0,如果为0,返回真,否则返回假。
    int atomic_sub_and_test(int i, atomic_t *v);

      该函数对原子类型变量v原子地增加1。
    void atomic_inc(atomic_t *v); 

      该函数对原子类型的变量v原子地减1。
    void atomic_dec(atomic_t *v); 

      该函数对原子类型的变量v原子地减1,并判断结果是否为0,如果为0,返回真,否则返回假。
    int atomic_dec_and_test(atomic_t *v);

      该函数对原子类型的变量v原子地增加1,并判断结果是否为0,如果为0,返回真,否则返回假。
    int atomic_inc_and_test(atomic_t *v); 
     
      该函数对原子类型的变量v原子地增加I,并判断结果是否为负数,如果是,返回真,否则返回假。
    int atomic_add_negative(int i, atomic_t *v);

      该函数对原子类型的变量v原子地增加i,并且返回指向v的指针。
    int atomic_add_return(int i, atomic_t *v);

      该函数从原子类型的变量v中减去i,并且返回指向v的指针。
    int atomic_sub_return(int i, atomic_t *v); 
     
      该函数对原子类型的变量v原子地增加1并且返回指向v的指针。
    int atomic_inc_return(atomic_t * v); 
     
      该函数对原子类型的变量v原子地减1并且返回指向v的指针。
    int atomic_dec_return(atomic_t * v); 
    有时候,不小心知道了一些事,才发现自己所在乎的事是那么可笑。
  • 相关阅读:
    x64 平台开发 Mapxtreme 编译错误
    hdu 4305 Lightning
    Ural 1627 Join(生成树计数)
    poj 2104 Kth Number(可持久化线段树)
    ural 1651 Shortest Subchain
    hdu 4351 Digital root
    hdu 3221 Bruteforce Algorithm
    poj 2892 Tunnel Warfare (Splay Tree instead of Segment Tree)
    hdu 4031 Attack(BIT)
    LightOJ 1277 Looking for a Subsequence
  • 原文地址:https://www.cnblogs.com/axjlxy/p/15264603.html
Copyright © 2011-2022 走看看