Go开发atomic之比较并交换操作(CAS)
有关CAS的文章,网络有很多详细说明,这里只做一个简洁的整理原理
比较并交换称为CAS ,如图所示:
如图所示,先从变量v中读取值,然后当修改时,就拿取的值再和内存中的值比一下。
这个也容易理解,比如说,我想修改的值是以原来取的那个值为参照的,如果当前这两个值不一样了,肯定是被别人改了 。因此,我不得不重新读取一次,再来修改,以此循环。
在这个故事中,还有一种情况,如果v被别人改了之后又再次改回来了还是v。那我方还以为v从来没变过,这就是ABA问题。修改上一篇的代码
上篇讲了一个例子,两个协程分别将整数n循环加5000次,我们用比较并交换来修改下:var n int32 = 0 sig := make(chan int) go func() { //看下尝试多少次 nTry := 0 for i := 0; i < 5000; i++ { for { old := n if atomic.CompareAndSwapInt32(&n, old, old+1) { break } else { nTry++ } } } fmt.Printf("nTry=%v ", nTry) sig <- 0 }() go func() { //看下尝试多少次 nTry := 0 for i := 0; i < 5000; i++ { for { old := n if atomic.CompareAndSwapInt32(&n, old, old+1) { break } else { nTry++ } } } fmt.Printf("nTry=%v ", nTry) sig <- 0 }() <-sig <-sig fmt.Println(n)
加一个for循环的原因是,可能一次没有成功,还需要重新尝试。
用这种模式也可以解决同步的问题Go中的CAS源码
实际代码文件在/src/runtime/internal/atomic/asm_amd64.s文件中TEXT runtime∕internal∕atomic·Cas64(SB), NOSPLIT, $0-25 MOVQ ptr+0(FP), BX MOVQ old+8(FP), AX MOVQ new+16(FP), CX LOCK // 比较BX和AX中的值,如果相等,将CX中的值给BX,即*addr=new CMPXCHGQ CX, 0(BX) // 设置返回值swapped,CMPXCHGQ比较如果相等,ret为1,否则为0 SETEQ ret+24(FP) RET
其中我们可以看作lock(一个命令前缀,在这里用于CMPXCHGQ) 可以锁住总线保证多次内存操作的原子性,然后执行CMPXCHGQ
CMPXCHGQ CX, 0(BX)的解释 :如果AX(旧)与BX(原)相等,则CX(新)送BX且ZF置1;否则BX送给CX,且ZF清0
因此,比较并交换是依赖硬件完成的CAS的优缺点
优点:乐观锁,轻量
缺点:解决不了ABACAS如果不成功则会发生自旋,但是自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。只能保证一个共享变量的原子操作
考上清华北大,意味着什么?谢谢邀请!感谢今日头条问答板块,就此问题,我谈谈自己粗浅看法,请各位网友不惜赐教。一考上清华北大对于整个家庭,甚至家族来说是很荣耀的一件事,意味着可以光宗耀祖,光耀门厅。一些乡下地
初一学生一学期从优生直接跳到了差生什么原因?怎么办?我说的你们信不信?小学成绩太假。我不是说小学老师在学生成绩上造假,而是说小学生的高分背后暗藏危机,这个危机藏得很深,让老师家长孩子发现不了,最终孩子付出巨大代价还不知道是怎么一会事
聘干身份提拔事业单位副科级以后还有晋升空间吗?废话不多说,明确告诉你聘干身份提拔事业单位副科级后,还有晋升空间。我部门就有一个副部长(副科级)是聘用干部,在人事调整中,晋升到了正科级。开发区(副厅级单位)建区的时候,他就来开发
因暖气不热安了循环泵,被邻居投诉并强行让我拆除,我该怎么办?这事以前在我住的小区发生过,当时闹得挺厉害,只是最后的处理结果让人始料未及。我们住的小区是一个差不多快二十年的小区,硬件设备都很落后,环境也不好最愁人的就是到了冬天,无论怎么放水放
在职考入某事业单位,职称聘任要从初级开始聘,合理吗?这种情况肯定是合理的,没有必要去和单位争执,争执太多对你没有什么好处。一般来说,专业技术岗的首次定级,要么按常规来操作,要么按招考公告来操作,要么按人才引进方式来进行。以下为我们市
东莞月入两万什么水平?算是很乐观的收入了这么说吧如果你在一个城市每个收入能在所在的城市购买一平方房子也就是说比当地普通房价收入还高那么你算混得相当不错了只有其他的东西就见仁见智了我是东莞本地人,在寮步镇
企业5000没人干,机关3000不辞职,企业用工荒怎么造成的?算算账就知道了。机关30001机关的3000是明面上的,是有据可查的,也是给别人看的。2各种补贴,各种福利,都是明面下的,是自己人看的。我一个朋友工资只有3200多,死都不肯离开,
一级教师相当于行政岗什么级别?踏浪经过一番查阅,最后初步认定,在地市州盟(以下简称市地级)一级行政区划管辖权下,中学一级教师(中级专业技术职务相当于中小学管理岗位的正科级(公务员系列的乡科级)职务。首先我们先来
在培训机构里做老师,有出息没?这个问题问出来就显得你很没出息,职业不分贵贱,行行出状元,培训机构里做老师同样是一个很好的职业选择,看看俞敏洪和他的那些教师大神们,哪个不是出类拔萃,你能说他们不是成功的老师典范吗
兰州新区目前体量多大,有没有打工岗位,未来发展怎么样?朋友,您好。就你的问题我简要做个答复。本来在兰州新区生活6年,都是个人对兰州新区的认识,望采纳。1。兰州新区体量不知道你说的是哪些体量(1)人口户籍人口不到30万,28。8万多。实
不读书的人当了老板,读书的人在打工,读书有什么用?不读书的人当了老板的是少数,而读书当老板当官的是多数,什么都没有绝对的相对多读书,比不读书少读书要好更有用,耍不读书干什么,那不成了读书无用了。答我尝到读书的甜头。1在知识越多越反