游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Golangpackageatomic库

  Go语言在设计上对同步(Synchronization,数据同步和线程同步)提供大量的支持,比如goroutine和channel同步原语,库层面有sync:提供基本的同步原语(比如Mutex、RWMutex、Locker)和工具类(Once、WaitGroup、Cond、Pool、Map)syncatomic:提供变量的原子操作(基于硬件指令compareandswap)
  atomic
  当我们想要对某个变量并发安全的修改,除了使用官方提供的mutex,还可以使用syncatomic包的原子操作,它能够保证对变量的读取或修改期间不被其他的协程所影响。
  atomic包的原子操作是通过CPU指令,也就是在硬件层次去实现的,性能较好,不需要像mutex那样记录很多状态。当然,mutex不止是对变量的并发控制,更多的是对代码块的并发控制,2者侧重点不一样。
  atomic这些功能需要非常小心才能正确使用。除了特殊的低级应用程序外,最好使用通道或同步包的工具来完成同步。通过通信共享内存;不要通过共享内存进行通信。
  atomic包有几种原子操作,主要是Add、CompareAndSwap、Load、Store、SwapAdd
  atomic的Add是针对int和uint进行原子加值的:
  当需要添加的值为负数的时候,做减法,正数做加法funcAddInt32(addrint32,deltaint32)(newint32)funcAddUint32(addruint32,deltauint32)(newuint32)funcAddInt64(addrint64,deltaint64)(newint64)funcAddUint64(addruint64,deltauint64)(newuint64)funcAddUintptr(addruintptr,deltauintptr)(newuintptr)CompareAndSwap
  比较并交换方法实现了类似乐观锁的功能,只有原来的值和传入的old值一样,才会去修改,
  CAS操作,会先比较传入的地址的值是否是old,如果是的话就尝试赋新值,如果不是的话就直接返回false,返回true时表示赋值成功。
  funcCompareAndSwapInt32(addrint32,old,newint32)(swappedbool)funcCompareAndSwapInt64(addrint64,old,newint64)(swappedbool)funcCompareAndSwapUint32(addruint32,old,newuint32)(swappedbool)funcCompareAndSwapUint64(addruint64,old,newuint64)(swappedbool)funcCompareAndSwapUintptr(addruintptr,old,newuintptr)(swappedbool)funcCompareAndSwapPointer(addrunsafe。Pointer,old,newunsafe。Pointer)(swappedbool)
  需要注意的是,CompareAndSwap有可能产生ABA现象发生。也就是原来的值是A,后面被修改B,再后面修改为A。在这种情况下也符合了CompareAndSwap规则,即使中途有被改动过。Load
  从某个地址中取值
  Load方法是为了防止在读取过程中,有其他协程发起修改动作,影响了读取结果,常用于配置项的整个读取。funcLoadInt32(addrint32)(valint32)funcLoadInt64(addrint64)(valint64)funcLoadUint32(addruint32)(valuint32)funcLoadUint64(addruint64)(valuint64)funcLoadUintptr(addruintptr)(valuintptr)funcLoadPointer(addrunsafe。Pointer)(valunsafe。Pointer)Store
  给某个地址赋值
  有原子读取,就有原子修改值,前面提到过的Add只适用于int、uint类型的增减,并没有其他类型的修改,而Sotre方法通过unsafe。Pointer指针原子修改,来达到了对其他类型的修改。
  funcStoreInt32(addrint32,valint32)funcStoreInt64(addrint64,valint64)funcStoreUint32(addruint32,valuint32)funcStoreUint64(addruint64,valuint64)funcStoreUintptr(addruintptr,valuintptr)funcStorePointer(addrunsafe。Pointer,valunsafe。Pointer)Swap
  交换两个值,并且返回老的值
  Swap方法实现了对值的原子交换,不仅int,uint可以交换,指针也可以。funcSwapInt32(addrint32,newint32)(oldint32)funcSwapInt64(addrint64,newint64)(oldint64)funcSwapUint32(addruint32,newuint32)(olduint32)funcSwapUint64(addruint64,newuint64)(olduint64)funcSwapUintptr(addruintptr,newuintptr)(olduintptr)funcSwapPointer(addrunsafe。Pointer,newunsafe。Pointer)(oldunsafe。Pointer)
  value类型
  最后一类Value用于任意类型的值的Store、Load,我们开始的案例就用到了这个,这是1。4版本之后引入的,签名的方法都只能作用于特定的类型,引入这个方法之后就可以用于任意类型了。
  syncatomic标准库包也提供了一个Value类型,以它为基的指针类型Value拥有四个方法(见下,其中后两个是从Go1。17开始才支持的)。Value值用来原子读取和修改任何类型的Go值。func(Value)Load()(xinterface{})func(Value)Store(xinterface{})func(Value)Swap(newinterface{})(oldinterface{})func(Value)CompareAndSwap(old,newinterface{})(swappedbool)CAS
  在syncatomic包中的源码除了Value之外其他的函数都是没有直接的源码的,需要去runtimeinternalatomic中找寻,这里为CAS函数为例,其他的都是大同小异boolCas(int32val,int32old,int32new)Atomically:if(valold){valnew;return1;}elsereturn0;TEXTruntimeinternalatomicCas(SB),NOSPLIT,017MOVQptr0(FP),BXMOVLold8(FP),AXMOVLnew12(FP),CXLOCKCMPXCHGLCX,0(BX)SETEQret16(FP)RET
  在注释部分写的非常清楚,这个函数主要就是先比较一下当前传入的地址的值是否和old值相等,如果相等,就赋值新值返回true,如果不相等就返回false
  我们看这个具体汇编代码就可以发现,使用了LOCK来保证操作的原子性,CMPXCHG指令其实就是CPU实现的CAS操作。示例对比Go语言在设计上对同步(Synchronization,数据同步和线程同步)提供大量的支持,比如goroutine和channel同步原语,库层面有sync:提供基本的同步原语(比如Mutex、RWMutex、Locker)和工具类(Once、WaitGroup、Cond、Pool、Map)syncatomic:提供变量的原子操作(基于硬件指令compareandswap)packagemainimport(fmtsyncsyncatomictime)var(xint64mxsync。Mutexwgsync。WaitGroup)普通函数,并发不安全funcAdd(){xwg。Done()}互斥锁,并发安全,性能低于原子操作funcMxAdd(){mx。Lock()xmx。Unlock()wg。Done()}原子操作,并发安全,性能高于互斥锁,只针对go中的一些基本数据类型使用funcAmAdd(){atomic。AddInt64(x,1)wg。Done()}funcmain(){原子操作atomic包加锁操作涉及到内核态的上下文切换,比较耗时,代价高针对基本数据类型我们还可以使用原子操作来保证并发安全因为原子操作是go语言提供的方法,我们在用户态就可以完成,因此性能比加锁操作更好go语言的原子操作由内置的库,syncatomic完成start:time。Now()fori:0;i10000;i{wg。Add(1)goAdd()普通版Add函数不是并发安全的goMxAdd()加锁版Add函数,是并发安全的,但是加锁性能开销大goAmAdd()原子操作版Add函数,是并发安全的,性能优于加锁版}end:time。Now()wg。Wait()fmt。Println(x)fmt。Println(end。Sub(start))}
  Go语言在设计上对同步(Synchronization,数据同步和线程同步)提供大量的支持,比如goroutine和channel同步原语,库层面有sync:提供基本的同步原语(比如Mutex、RWMutex、Locker)和工具类(Once、WaitGroup、Cond、Pool、Map)syncatomic:提供变量的原子操作(基于硬件指令compareandswap)packagemainimport(fmtsyncsyncatomictime)var(xint64mxsync。Mutexwgsync。WaitGroup)普通函数,并发不安全funcAdd(){xwg。Done()}互斥锁,并发安全,性能低于原子操作funcMxAdd(){mx。Lock()xmx。Unlock()wg。Done()}原子操作,并发安全,性能高于互斥锁,只针对go中的一些基本数据类型使用funcAmAdd(){atomic。AddInt64(x,1)wg。Done()}funcmain(){原子操作atomic包加锁操作涉及到内核态的上下文切换,比较耗时,代价高针对基本数据类型我们还可以使用原子操作来保证并发安全因为原子操作是go语言提供的方法,我们在用户态就可以完成,因此性能比加锁操作更好go语言的原子操作由内置的库,syncatomic完成start:time。Now()fori:0;i10000;i{wg。Add(1)goAdd()普通版Add函数不是并发安全的goMxAdd()加锁版Add函数,是并发安全的,但是加锁性能开销大goAmAdd()原子操作版Add函数,是并发安全的,性能优于加锁版}end:time。Now()wg。Wait()fmt。Println(x)fmt。Println(end。Sub(start))}
  Go语言在设计上对同步(Synchronization,数据同步和线程同步)提供大量的支持,比如goroutine和channel同步原语,库层面有sync:提供基本的同步原语(比如Mutex、RWMutex、Locker)和工具类(Once、WaitGroup、Cond、Pool、Map)syncatomic:提供变量的原子操作(基于硬件指令compareandswap)packagemainimport(fmtsyncsyncatomictime)var(xint64mxsync。Mutexwgsync。WaitGroup)普通函数,并发不安全funcAdd(){xwg。Done()}互斥锁,并发安全,性能低于原子操作funcMxAdd(){mx。Lock()xmx。Unlock()wg。Done()}原子操作,并发安全,性能高于互斥锁,只针对go中的一些基本数据类型使用funcAmAdd(){atomic。AddInt64(x,1)wg。Done()}funcmain(){原子操作atomic包加锁操作涉及到内核态的上下文切换,比较耗时,代价高针对基本数据类型我们还可以使用原子操作来保证并发安全因为原子操作是go语言提供的方法,我们在用户态就可以完成,因此性能比加锁操作更好go语言的原子操作由内置的库,syncatomic完成start:time。Now()fori:0;i10000;i{wg。Add(1)goAdd()普通版Add函数不是并发安全的goMxAdd()加锁版Add函数,是并发安全的,但是加锁性能开销大goAmAdd()原子操作版Add函数,是并发安全的,性能优于加锁版}end:time。Now()wg。Wait()fmt。Println(x)fmt。Println(end。Sub(start))}
  原子操作是比其它同步技术更基础的操作。原子操作是无锁的,常常直接通过CPU指令直接实现。事实上,其它同步技术的实现常常依赖于原子操作。例如上面的的mx。lock
  atomic包提供了底层的内存操作,对于同步算法的实现很有用,这些函数必须谨慎的保证正确使用,除了某些特殊的底层应用,使用通道或者sync包的函数类型实现同步更好
  atomic很多时候可能都没有使用上,毕竟mutex的拓展性比较好,使用起来也比较友好。但这并不妨碍我们对极致性能的追求,有时候,细节决定了性能!ReferencesGolang:sync。OnceSynchronization(ComputerScience))SIP20ImprovedLazyValsInitializationsyncatomicGoPackagesGolangpackagesync剖析(一):sync。Oncesyncatomic标准库包中提供的原子操作Go并发编程(五)深入理解syncatomicGo语言标准库中atomic。Value的前世今生深入浅出Gosyncatomic源码分析

脑萎缩造成的原因有什么呢为什么会脑萎缩呢大家在生活中应该都听说过非常多的疾病吧,但是你了解脑萎缩吗?今天小编就和大家一起来了解一下吧,究竟脑萎缩造成的原因有什么呢,以及为什么会脑萎缩呢,跟着小编我们一起来学习吧。脑萎……失忆一般是什么造成的呢造成失忆的原因有什么呢大家在生活中应该都听说过失忆吧,但是你了解失忆吗?今天小编就和大家一起来了解一下吧。究竟失忆一般是什么造成的呢,以及造成失忆的原因有什么呢?跟着小编我们一起来学习吧。失忆一般是……力拼世锦赛首冠!凯伦威尔逊难阻丁俊晖!资格赛选手也曾两次夺冠2021到2022赛季的斯诺克职业联赛继续进行,北京时间2022年4月20日,斯诺克世锦赛首轮比赛继续打响。中国军团在世锦赛首轮比赛最后一个亮相的球员是丁俊晖。丁俊晖也是中国斯……止痛药痛经什么时候吃止痛药痛经一天几次每个女孩子每个月都会来例假,而有些女生在这时可能会出现痛经的现象,所以很多女生会选择服用止痛药,那么止痛药痛经什么时候吃?止痛药痛经一天几次?止痛药痛经什么时候吃通常可以……痛经需要注意什么原发性痛经会遗传吗痛经是女生都比较怕的,有的人痛经是非常严重,严重到需要去输液,那么痛经需要注意什么呢,原发性痛经会遗传吗,下面一起来看看吧。痛经需要注意什么1、平时要勤加锻炼,但在月经期……黄瓜最好吃的4种做法,鲜香美味,步骤简单易学,年夜饭上露一手冬日生活打卡季黄瓜是我们生活中常见的蔬菜,它脆嫩多汁,爽脆可口,含有丰富的维生素、微量元素和矿物质,具有利水利尿,清热解毒的功效,除此之外,还有减肥的作用。黄瓜最营……造成痛经的原因有什么呢为什么会痛经呢大家在生活中应该都听说过痛经吧,但是你了解为什么会痛经吗?今天小编就和大家一起来了解一下吧,究竟造成痛经的原因有什么呢,以及为什么会痛经呢?跟着小编我们一起来学习吧。造成痛经的……最后一波顶级红叶!超长风景线堪称红叶届长桌宴!观赏期超长错过9月喀纳斯的色彩大展演错过香山的霜重色愈浓错过川西的彩林盛宴我,不允许你再错过这里的万山红遍长江三峡红叶盛宴全国上线最晚、风景线最长……英格兰队奇尔韦尔因伤无缘卡塔尔世界杯新华社伦敦11月5日电英超切尔西俱乐部5日发布公告,宣布效力本队的英格兰队球员本奇尔韦尔因伤无缘卡塔尔世界杯。公告中写道:在对阵萨格勒布迪纳摩的(欧冠)比赛中受伤后,本接……积善之家,必有余庆行善积德的人家,所有的福泽会庇佑到子孙后代,一个人积德行善,不仅仅是给自己修福报,更是给子孙后代修福报。人生就是一场修行,我们会面对外界的各种各样的诱惑,如何保持自己的善……女人如何正确的使用卫生巾?卫生巾清凉好不好?女性最常用的就是卫生巾了,那么,女人如何正确的使用卫生巾呢?女人怎么样用卫生巾1、使用方法卫生巾的形状主要有两种,一种是直条型的,另一种是两侧带着耳朵的卫生巾。如果……月经初潮用什么卫生巾比较好?月经初潮出血量少正常吗?女性月经初潮,往往不知道该怎么选用卫生巾。那么,月经初潮用什么卫生巾比较好呢?月经初潮用什么卫生巾透气性强、吸收能力强、超长型的卫生巾。原因:月经初潮出血量会有不规……
澳佳宝月见草胶囊适合什么人?澳佳宝月见草胶囊还是挺出名的,很多人都只知道这个能治月经不调,那么这个究竟哪些人最适合呢,下面5号网的小编为你们介绍澳佳宝月见草胶囊适合什么人?澳佳宝月见草胶囊适合什么人……青海戈壁滩上惊现奇特建筑,形似外星人基地,周围全是无人区青海之旅,总是惊喜不断,也许是连绵起伏的昆仑雪山,也许是露天喷涌的高原神泉,也许是像极了高人隐居的道观,又或者如外星人基地的建筑。我们在三江源头,神秘昆仑的采风之旅中,几……易建联结束特训回国!紧牵娇妻现身机场,妻子放弃事业照顾孩子对于运动选手而言,想要有一个优秀的成绩,必须不断的锻炼自己自身的实力和技术。前一段时间的易建联为了下个赛季能够更好的表现,毅然决然的前往美国特训。随着日子一天一天的过去,易建联……魅友节感恩来袭!不止购机可享专属特惠,更有9。9元秒杀心意好为了回馈长久以来魅友的支持,魅族于9月9日起发起了2022魅友节活动。据悉具体活动安排上,在此期间前往魅族官网购机不仅可享专属的机型价格优惠,同时还有着18个月质保,碎屏保障5……鹿胎膏什么时候吃最好?鹿胎膏最佳服用时间鹿胎膏对女性来说是一款非常好的药,药性温和效果好,下面5号网的小编为你们介绍鹿胎膏什么时候吃最好?鹿胎膏最佳服用时间。鹿胎膏什么时候吃最好鹿胎膏早晚各服用一次,饭前或者饭……16年前,冥王星不再是行星,被地球科学家降级的原因和经过可怜的冥王星(Pluto)。在2006年8月24日的国际天文学联合会(IAU)大会上,第九颗行星在发现仅76年后被排除。奇怪的是投票排除冥王星的是天文学家,而不是行星科学……指甲分层是怎么回事?指甲分层怎么办?指甲的问题变化其实是在折射我吗身体是问题,少部分人会出现手指甲分层起层的现象。指甲分层是怎么回事?指甲分层怎么办?指甲分层是怎么回事慢性疾病引起指甲与甲床分离,又叫……荣耀也没有扛住压力,骁龙84800mAh5倍光变,已经跌到3前段时间有数码大V表示国产手机冲击高端市场集体失败,起初我还不相信,直到我看到很多国产旗舰手机都在大降价时才明白,原来真是如此。就连在Q2季度唯一实现增长的国产手机品牌荣耀貌似……形势严峻!鞍钢安钢攀钢永钢这些钢企这样应对今年初以来,受国际形势复杂严峻、国内疫情散点多发、产业链供应链运行不畅等因素影响,钢材市场呈现供给减量、需求偏弱、库存上升、价格下跌、成本上涨、收入减少、利润下滑的运行态势,企……参天pc眼药水说明书参天pc蓝光眼药水使用方法参天pc电脑手机眼药水是一款手机电脑人士的福音眼药水,和fx眼药水可谓是旗鼓相当,不过因为是日本生产,所以很麻烦的就是说明书是日文的,下面为大家翻译说明书,教大家使用方法……什么是透骨草?透骨草的功效与作用是什么?什么是透骨草,估计有很多人都不知道。有时就算走在路上遇到他们,也以为是路边的野花野草。那么,你知道什么是透骨草吗?透骨草的功效与作用是什么呢?什么是透骨草透骨草又名药曲草……张嘴睡觉是什么原因张嘴睡觉越长越丑吗睡觉的时候我们肯定是不会注意是张嘴的还是闭嘴的,近日有专家表明说张嘴睡觉会越来越丑,而且严重的还会影响智力哦,到底是不是这样的呢?我们一起来看下吧!图片对比左边是用……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网