zoukankan      html  css  js  c++  java
  • c语言中的原子操作

    参考文章:https://blog.csdn.net/yikai2009/article/details/8650221

    1. 原子操作:
    原子操作指的是在执行过程中不会被别的代码所中断的操作.。分为 位 和 整型变量 两类原子操作。

    typedef struct { volatile int counter; } atomic_t;

    2. 原子操作函数 分为 整形原子操作 和 位原子操作

    3. 整型原子操作:

    void atomic_set(atomic_t *v, int i); //设置原子变量v的值为i

    atomic_t v = ATOMIC_INIT(0); //定义原子变量v, 并初始化为0

    atomic_read(atomic_t *v); //获得原子变量的值,返回原子变量的值

    void atomic_add(int i, atomic_t *v); //原子变量+i

    void atomic_sub(int i, atomic_t *v); //原子变量-i

    void atomic_inc(atomic_t *v); //原子变量+1
    void atomic_dec(atomic_t *v); //原子变量-1

    对原子变量执行自增,自减和减操作后 ,测试其是否为0,为 0 则返回 true,否则返回 false :

    int atomic_inc_and_test(atomic_t *v);

    int atomic_dec_and_test(atomic_t *v);

    int atomic_sub_and_test(int i, atomic_t *v);

    对原子变量进行加/减,自增/自减操作,并返回新的值:

    int atomic_add_return(int i, atomic_t *v);

    int atomic_sub_return(int i, atomic_t *v);

    int atomic_inc_return(atomic_t *v);

    int atomic_sub_return(atomic_t *v);

    int atomic_add_unless(atomic_t *v, int a, int u);  ( v!=u ) ? v+a,返回非0值 : 0;

    int atomic_inc_not_zero(atomic_t *v);                ( v!=0 ) ? v+1,返回非0值 : 0;

    atomic_dec_not_one()   这是一个宏,不等于1,返回非0值;等于1,返回0

    4. 位原子操作:
    void set_bit(nr, void *addr); //将addr地址的nr位 置为1

    void clear_bit(nr, void *addr); //将addr地址的nr位 置为0

    void change_bit(nr, void *addr); //对addr地址的nr位 反置

    int test_bit(nr, void *addr); //返回addr地址的nr位

    int test_and_set_bit(nr, void *addr); //将*addr 的第n位设置成1,并返回原来这一位的值

    int test_and_clear_bit(nr, void *addr); //将*addr 的第n位设置成0,并返回原来这一位的值

    int test_and_change_bit(nr, void *addr); 

  • 相关阅读:
    IntentService使用以及源码分析
    Android HandlerThread源码解析
    Android Handler消息机制源码解析
    Gradle技术之四
    Android EditText实现小数点后几位的终级方案
    Gradle系列之三 Gradle概述以及生命周期
    Gradle系列之二 Groovy对文件的操作
    Gradle系列之一 Groovy语法精讲
    Context源码分析
    用EXCLE群发outlook邮件
  • 原文地址:https://www.cnblogs.com/jyfyonghu/p/11256608.html
Copyright © 2011-2022 走看看