参考文章: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); 

c语言中的原子操作的更多相关文章

  1. Go语言中的单例模式(翻译)

    在过去的几年中,Go语言的发展是惊人的,并且吸引了很多由其他语言(Python.PHP.Ruby)转向Go语言的跨语言学习者. Go语言太容易实现并发了,以至于它在很多地方被不正确的使用了. Go语言 ...

  2. Go语言中的单例模式

    Go语言中的单例模式 在过去的几年中,Go语言的发展是惊人的,并且吸引了很多由其他语言(Python.PHP.Ruby)转向Go语言的跨语言学习者. Go语言太容易实现并发了,以至于它在很多地方被不正 ...

  3. Go语言中的并发编程

    并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因. Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天) ...

  4. 【Golang详解】go语言中并发安全和锁

    go语言中并发安全和锁 首先可以先看看这篇文章,对锁有些了解 [锁]详解区分 互斥锁.⾃旋锁.读写锁.乐观锁.悲观锁 Mutex-互斥锁 Mutex 的实现主要借助了 CAS 指令 + 自旋 + 信号 ...

  5. Redis 中的原子操作(1)-Redis 中命令的原子性

    Redis 如何应对并发访问 Redis 中处理并发的方案 原子性 Redis 的编程模型 Unix 中的 I/O 模型 thread-based architecture(基于线程的架构) even ...

  6. Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性

    Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...

  7. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  8. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  9. python语言中的编码问题

    在编程的过程当中,常常会遇到莫名其妙的乱码问题.很多人选择出了问题直接在网上找答案,把别人的例子照搬过来,这是快速解决问题的一个好办法.然而,作为一个严谨求实的开发者,如果不从源头上彻底理解乱码产生的 ...

  10. 在C语言中利用PCRE实现正则表达式

    1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...

随机推荐

  1. 如何用premiere添加配乐?pr视频添加音乐

    在pr中,怎么给视频添加音乐? 给视频添加音乐,有两种情况:1是视频音乐已存在:2是视频没有音乐,只是单纯的视频. 1.从酷狗音乐里下载一首音乐到桌面. 2.将音乐文件直接拖动到音频轨道里,把素材面板 ...

  2. 商城登录/三方登录OAUTH2/单点登录

  3. 记录POI导入时单元格下拉框两种实现方式(excel数据有效性)

    如果下拉选项字符少于225 使用方式1 public static HSSFSheet setHSSFValidation(HSSFSheet sheet, String[] textlist, in ...

  4. docker中搭建Ubuntu:16.04+python3.6+django环境

    用vim 新建一个Dockerfile和sources.list文件,在里面添加如下内容. #sources.list deb http://mirrors.163.com/ubuntu/ xenia ...

  5. 最小化安装debian10&gnome最小化安装

    直到后面配置网络源之前都是断网安装,因为debian security好像总是要去总源找点东西,所以即便你选择国内源甚至不选择网络源安装,依然会莫名 的失败. I. 最小化安装debian10(用ro ...

  6. 芯片ADS9224R的FPGA驱动实现

    ADS9224R这款芯片是德州仪器(TI)的一款SAR ADC,笔者写这芯片IP核大概有段时间了,这款ADC采集芯片挺复杂的.笔者当时对写axi4_lite的IP核还不是很熟悉,就接下了含有这款芯片的 ...

  7. office2016word打开总是提示安全模式

    突然打开word和Excel提示是否使用安全模式,如果选择否就自动退出office,选择是进入后,编辑一下也会自己退出,非常郁闷. 之后上网查看,尝试了许多: 1.win+R 运行%appdata%\ ...

  8. Redis缓存中的数据和数据库不一致

    首先关于两者数据的一致性包含有两种情况: (1)缓存中有数据时,那数据库中的数据要和缓存中的数据相同: (2)缓存中没有数据时,数据库中的数据必须是最新的. 如果不符合以上两种情况,就属于缓存和数据库 ...

  9. SQL in查询字段为Guid拼接处理办法

    场景一:在我们写SQL脚本执行普通的Id 为Int,Long 类型查询为 譬如: select *from Table where id in (1,2,3); 场景二:SQL in 查询,当查询字段 ...

  10. spring-cloud项目初始化问题

    无法引入本地依赖 参考:https://blog.csdn.net/qq_39684784/article/details/115289982 时区问题: url设置:serverTimezone=U ...