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, ...) 

相关内容

热门资讯

美国突发:家庭聚会上发生枪击事... 当地时间5月4日凌晨,美国休斯敦一处住宅正在举行的家庭聚会上发生枪击事件,14人中枪,1人死亡,多人...
耐克、阿迪达斯、斯凯奇……76... 转自:扬子晚报当地时间5月2日,央视记者获悉,美国鞋类分销商和零售商协会本周致信白宫,请求豁免美国总...
将志愿服务融入基层治理,广州黄... 中国青年报客户端讯(黄三笑 中青报·中青网记者 林洁)近日,广州市黄埔区启动志愿者实训基地巡山护林活...
给U盘加密的几种方法 U盘易丢失,为防止文件被随意查看,可对其进行加密处理。那么,如何给U盘加密?1、 安装U盘加密软件时...
华安证券给予圣湘生物买入评级,... 华安证券05月04日发布研报称,给予圣湘生物(688289.SH)买入评级。评级理由主要包括:1)呼...
【文化中国行】“五一”假期文艺... 转自:央视网央视网消息 (新闻联播):这个“五一”假期,文艺演出市场热度持续攀升,在满足大众假期文化...
把青春“种”在合肥 港青八年“... 来源:中国新闻网 中新社合肥5月4日电 题:把青春“种”在合肥 港青八年“破土”成新农人作者 傅天骋...
把青春“种”在合肥 港青八年... 中新社合肥5月4日电 题:把青春“种”在合肥 港青八年“破土”成新农人作者 傅天骋“人生就像育种,总...
美国休斯敦一家庭聚会上发生枪击... 当地时间5月4日凌晨,美国休斯敦一处住宅正在举行的家庭聚会上发生枪击事件,14人中枪,1人死亡,多人...
C视频|青春不“打烊” “五四... 川观新闻记者 韦维“五一”假期渐近尾声,“五四”青年节如期而至。当许多人享受着假日的闲暇,一群青年正...
文化中国行 河海津韵:长城博物... 转自:天津广播电视台天津北方网讯:文化中国行,品河海津韵。五一期间,经过半年提升改造,黄崖关长城博物...
【生活】五一档电影总票房破6亿... 五一小假期除了出门旅游,应该也有不少小伙伴选择在家休息陪家人,偶尔出去看个电影和朋友相约聚餐逛街之类...
信达证券给予天润乳业买入评级,... 信达证券05月04日发布研报称,给予天润乳业(600419.SH)买入评级。评级理由主要包括:1)乳...
360云盘使用教程及体验评价 360云盘如何使用?它好用吗?许多人喜欢将下载的内容存入云盘。提到这个,就不得不谈谈360云盘的使用...
淘宝闪购全量上线24小时 库迪... 人民财讯5月4日电,5月2日,淘宝天猫旗下即时零售业务“小时达”升级后的“淘宝闪购”宣布提前全量上线...
青年如何向巴菲特学投资? 来源:圆方你怎么看啊01今天是五四青年节,先祝所有的青年小伙伴节日快乐。对于任何人来说,青年时期都是...
华安证券给予三只松鼠买入评级 华安证券05月04日发布研报称,给予三只松鼠(300783.SZ)买入评级。评级理由主要包括:1)收...
俄媒:斯洛伐克总理证实,将赴俄... 【环球网报道】据“今日俄罗斯”(RT)4日报道,斯洛伐克总理菲佐当天证实,将出席5月9日在俄罗斯首都...
普京称俄中关系对维护世界稳定具... 俄罗斯总统普京在“俄罗斯-1”电视频道4日播出的一部纪录片中表示,自25年前他初次担任总统时就注意到...