C语言的原子操作(待完善)
创始人
2024-05-29 01:31:47
0

文章目录

  • 一、什么是原子操作
  • 二、为什么需要原子操作
  • 三、API

一、什么是原子操作

原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事件中断,可以视为最小的操作单元,是在执行的过程中、不会导致对数据的并发访问的、最小操作,因此称为原子操作。最简单的原子操作,就是交换一个寄存器和一个内存地址的值,

原子操作,是实现锁机制的基础。mutex,spinlock等,在其底层都有一个关键的原子操作。在编程语言中一般分为两种情况):

  1. 在单线程中, 能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间;
  2. 在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。

二、为什么需要原子操作

在多核处理器的机器上,对于同一个变量值所存在的内存区域可能被多个CPU短时间内同时访问,从而导致该值得不稳定性。例如在多线程中,初始化 i = 0,对于 i++ 这个操作,同时有2个线程对其进行了调用则有可能导致第一个线程用时 i 的值为 2

i++ 的操作分为三步:

  1. 内存访问,读取i变量的值到CPU的寄存器中;
  2. 使寄存器中的值 +1;
  3. 将寄存器中的值写回到内存。

由此可见,i++并不是原子操作,在没有线程保护的多线程处理器中,每一步都有可能被外部中断给打断,从而影响到 i 的值。如果2个线程同时调用了 i++,i 可能直接从 0 变为 2——线程1 在寄存器中使得 i自增1的同时线程2也在做此操作,因此当取出寄存器中i的值到内存时,i 不知不觉被加了2次

三、API


//将value加到*ptr上,结果更新到*ptr,并返回操作之前*ptr的值
type __sync_fetch_and_add (type *ptr, type value, ...) // 从*ptr减去value,结果更新到*ptr,并返回操作之前*ptr的值
type __sync_fetch_and_sub (type *ptr, type value, ...) // 将*ptr与value相或,结果更新到*ptr, 并返回操作之前*ptr的值
type __sync_fetch_and_or (type *ptr, type value, ...) // 将*ptr与value相与,结果更新到*ptr,并返回操作之前*ptr的值
type __sync_fetch_and_and (type *ptr, type value, ...) // 将*ptr与value异或,结果更新到*ptr,并返回操作之前*ptr的值
type __sync_fetch_and_xor (type *ptr, type value, ...) // 将*ptr取反后,与value相与,结果更新到*ptr,并返回操作之前*ptr的值
type __sync_fetch_and_nand (type *ptr, type value, ...) // 将value加到*ptr上,结果更新到*ptr,并返回操作之后新*ptr的值
type __sync_add_and_fetch (type *ptr, type value, ...) // 从*ptr减去value,结果更新到*ptr,并返回操作之后新*ptr的值
type __sync_sub_and_fetch (type *ptr, type value, ...) // 将*ptr与value相或, 结果更新到*ptr,并返回操作之后新*ptr的值
type __sync_or_and_fetch (type *ptr, type value, ...) // 将*ptr与value相与,结果更新到*ptr,并返回操作之后新*ptr的值
type __sync_and_and_fetch (type *ptr, type value, ...) // 将*ptr与value异或,结果更新到*ptr,并返回操作之后新*ptr的值
type __sync_xor_and_fetch (type *ptr, type value, ...) // 将*ptr取反后,与value相与,结果更新到*ptr,并返回操作之后新*ptr的值
type __sync_nand_and_fetch (type *ptr, type value, ...) // 比较*ptr与oldval的值,如果两者相等,则将newval更新到*ptr并返回true
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...) // 比较*ptr与oldval的值,如果两者相等,则将newval更新到*ptr并返回操作之前*ptr的值
type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...) 

相关内容

热门资讯

万众创新的含义,大众创业 万众... 2017年7月27日,国务院发布《国务院关于强化实施创新驱动发展战略进一步推进大众创业万众创新深入发...
再谈创业者的价值观(创业的价值... 微信官方账号:第一品牌官无论任何时候,我们都在为中国制造业发出品牌声音!01企业家价值观三十年前就有...
未来的创业趋势是什么,创业失败... 这是我们坚信多年的铁律。如果只看注册公司的统计,创业成功率可能真的只有10%,甚至更低。统计显示,8...
第一次创业开什么店好,怎样开公... 在目前的市场环境下,对于一个刚创业的人来说,项目的选择真的很重要,稍有疏忽就很容易导致创业失败。那么...
企业孵化器,创业加速器是什么意... 创业加速器是一种通过教育引导和提供资金等手段来加速初创企业发展的新型创业模式。它只有很短的历史,但这...
借力REITs“东风” 房企谋... 6月27日,中金中国绿发商业资产REIT上市首日开盘涨幅达30%,触及涨停。这是今年以来消费基础设施...
市委全面深化改革委员会召开第十...   本报讯(记者 祁梦竹 范俊生)昨天下午,市委全面深化改革委员会召开第十五次会议,审议《北京市宏观...
人工智能创业项目,数字创业 人... 随着AI行业的快速发展,数据标注行业无疑是一个十亿美元的市场,数据相当于人工智能算法的“燃料”。作为...
大学生创业新颖的点子,创业意识... 关于孩子在业余时间能否赚到零花钱,有两种声音。一个声音认为,孩子的任务是专心学习,赚钱是大人的事,不...
大学生创业计划书怎么写(计算机... 随着网络经济和电子商务的快速发展,网上创业已经成为广州大学生自主创业的重要途径。接下来,请享受学习。...