Go开发atomic之Add(修改操作)
为什么会出现原子操作?
有很多代码并不是一条指令能完成的,比如下面一段用C写的代码,反汇编如下:inta10;a;对a的汇编解释9:a;0040102Fmoveax,dwordptr〔ebp4〕00401032addeax,100401035movdwordptr〔ebp4〕,eax
可以看到,a表面只有一句代码,但实际需要三条指令,这有什么问题吗?
假如甲先拿到a10,然后执行,结果半路上被CPU调度暂停了(三条指令中的某个地方),而乙也去拿数据a10,它没有停,一下就将a自增到11,并写回到内存。
等到甲被唤醒之后继续操作,但它不知道其实a已经被改了,然后将结果11又写到内存中。
然而,我们期望的是加两次等于12,而最终的结果却是11,与期望相差很大。
因此,这个问题在于:若干个人(线程)一窝蜂的对一个共享变量进行无约束的操作,中间肯定会出现错加的情况,如下图所示:
go语言模拟如下varnint320sig:make(chanint)gofunc(){fori:0;i5000;i{n}sig0}()gofunc(){fori:0;i5000;i{n}sig0}()sigsigfmt。Println(n)
分析:两个协程各加5000次,期望结果是10000,但在大多数情况下结果都不正确。
为了避免这种情形发生,一个容易想到的做法就是独占操作,独占并不强调顺序,而是指当某个人操作的时候,其它任何人都不能读写,什么都不能做,只能等待。
syncatomic包就提供了这些独占操作的函数,称为原子操作类函数。修改操作
分为下面几类funcAddInt32(addrint32,deltaint32)(newint32)funcAddUint32(addruint32,deltauint32)(newuint32)funcAddInt64(addrint64,deltaint64)(newint64)funcAddUint64(addruint64,deltauint64)(newuint64)funcAddUintptr(addruintptr,deltauintptr)(newuintptr)
由于大同小异,我们只说明AddInt32和AddUint32。funcAddInt32(addrint32,deltaint32)(newint32)
其中第一个参数是地址,因为是对原址的修改,不赘述。第二个参数是delta,也就是差值。varnint320加2atomic。AddInt32(n,2)fmt。Println(n)2减1atomic。AddInt32(n,1)fmt。Println(n)1
对于AddUint32函数,第二个参数delta是无符号数,因此不能传负数,一个迂回的方法是设置为:uint32(c1),其中c是负数的绝对值。
推理如下
负数在内存中是补码表示的,比如:C代码unsignedinta2;unsignedintba1;unsignedintba0xffffffff;
a1等价于a0xFFFFFFFF,因为1的补码就是0xFFFFFFFF。
补码的顺口溜是:绝对值按位取反再加1。如果换成另一种说法:绝对值减1再取反,两者是完全等价的,这就是uint32(c1)的由来。它是补码计算的第二种表示。计算a2varauint3210atomic。AddUint32(a,uint32(21))fmt。Println(a)打印8总结
这篇介绍了为什么出现原子操作和其中之一的修改操作,下篇继续研究
添加剂吃多了,会致癌吗?提醒5种添加剂尽量少碰常言道:民以食为天,所有的食品安全大如天,老百姓非常关注,尤其食品添加剂,一旦有不合格,使身体的健康和生命受到威胁,导致大家对食品安全出现恐惧,很多人甚至觉得之所以有癌症,因为……
1955年授衔,开国元帅除了向主席敬军礼外,为何也向总理敬了有这样的一个人在小小的年龄便表现出对国家对人民的奉献精神,为中华崛起而读书,在少年时便对自己的未来有清楚的规划。生在乱世,不惜付出自己的全部为了祖国的崛起,为了民族日后的繁荣。……
醒醒吧!目前的经济状况下,该如何自保?大家也知道,因为口罩的原因,现在的大环境可以说得上是非常严峻,上到国企业受到影响,下到各个实体经济,私企、民企、个体经营都受到重创。实体经济萎靡不振感受最为深刻的当……
失踪107年!泰坦尼克号之后最大的沉船被找到极目新闻记者胡秀文据英国《太阳报》报道,耐力号(Endurance)是泰坦尼克号之后最大的沉船发现。耐力号是南极探险家欧内斯特沙克尔顿爵士的船,沉没一个多世纪后,3……
此书得来不易此物得来不易,听说朋友的老父亲,有一本收藏多年的,人民画报增刊,而且还是1976年的老物件,参观后就想纳入囊中,怎奈朋友的老父亲一口回绝,之后我有事没事的往他家跑,老爷子喜欢喝……
日本有大谷翔平,韩国有孙兴慜,我们的下一个体育巨星在哪里?近日,一条棒球方面的体育消息成为网友热议的话题,日本棒球运动员大谷翔平以全票的成绩获得职棒大联盟的MVP,这个成绩相当于2016年全票获得MVP的库里。这是日本棒球的一个里程碑……
我愿意成为一个反叛者,而不是一个奴隶先生,我是沃茨太太。请叫我莫德。爱普索姆赛马场的事故1913年,一位妇女跨过栏杆,闯进爱普索姆赛马场的跑道。奔跑的马匹剧烈撞击了这位妇女,这位倒下的妇女手上,……
新一代青年干部要有谦卑之心夏爽组织部谦虚谨慎,低调内敛,不仅仅是一种性格特质,还能彰显一个人的精神境界和胸襟气量。历史上也有许多人都有同样的感慨。汉高祖刘邦也曾说,夫运筹策帷帐之中,决胜千里之外,……
铜产业循环经济基地当好店小二跑出加速度去年以来,铜基地作为贵溪市经济建设的主战场,努力扮演好服务企业的店小二角色,积极探索,大胆创新,不断加快新旧动能转换,园区呈现出速度与深度并进、质量与效益共升的高质量发展态势。……
eStar冠军五人组包揽最佳,清融百分百胜率太离谱,久诚CaeStar冠军五人组包揽KPL秋季赛最佳阵容一队,TTG除冰尘之外全部上榜,阿改辅助崭露头角KPL秋季赛结束之后也是照常举办了最佳阵容的评选,这个赛季与之前赛季几乎不同,……
中日女乒经典之战,王曼昱横扫伊藤美诚,绝对的实力碾压如果说陈梦是伊藤美诚的噩梦,那王曼昱对伊藤来说可以算得上是噩梦中的噩梦,陈梦虽然每次碰上伊藤美诚都获得胜利,还被国乒当作定海神针来等着最后镇压伊藤美诚,但却也才只打了四次,更何……
清朝这一世啊明朝是中国最后一个汉族王朝,从1368年到1644年,明王朝走过了276年的风风雨雨,经历了16位曾坐拥江山的帝王,从明太祖朱元璋揭竿起义加强了专制主义中央集权的洪武之治到明思……