<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
程式碼中的加鎖操作因為涉及核心態的上下文切換會比較耗時、代價比較高。針對基本資料型別我們還可以使用原子操作來保證並行安全,因為原子操作是Go語言提供的方法它在使用者態就可以完成,因此效能比加鎖操作更好。Go語言中原子操作由內建的標準庫sync/atomic
提供。
大多數情況下我們都是針對基本資料型別進行資料操作,能不加鎖就不加鎖。
首先很多人都不相信基本型別並行修改會出現競態問題。不妨嘗試一下,並行加一。
var wg sync.WaitGroup for i := 0; i < 10000; i++ { wg.Add(1) go func () { defer wg.Done() xInt32++ }() } wg.Wait() print(xInt32)
無論輸出多少次都無法達到10000
,之所以如此就是因為此處的加1操作並不是原子的,都是先取當前值,加1,再賦值,會出現覆蓋的情況。
修改是最常用到的。
func modify(delta int32) { atomic.AddInt32(&xInt32, delta) atomic.AddInt64(&xInt64, int64(delta)) atomic.AddUint32(&xuInt32, uint32(delta)) atomic.AddUint64(&xuInt64, uint64(delta)) }
我們忽略了Uintptr
的討論,這是記憶體地址的整數表示,是用來存地址內容的,暫時沒有遇到過指標的資料計算。
var wg sync.WaitGroup for i := 0; i < 10000; i++ { wg.Add(1) go func () { defer wg.Done() //xInt32++ modify(1) }() } wg.Wait() print(xInt32)
改為原子操作後,發現每次執行都可以得到預期的結果10000
,
在並行情況下,讀取到某個變數後,在使用時變數內容可能會被篡改,所以使用原子讀取。 在並行情況下,為某個變數賦值的時候,必須要防止讀取到寫入一半的錯誤值,所以要用原子寫入。
var xInt32 int32 atomic.StoreInt32(&xInt32, 100) println(xInt32) v := atomic.LoadInt32(&xInt32) println(v)
輸出
100
100
就目前而言,原子讀寫都是為了防止讀寫一半導致資料錯誤,但我無法復現這種錯誤的場景,假如你可以復現請在本文底部放留言。
var v atomic.Value v.Store([]int{}) fmt.Println(v.Load().([]int))
也可以儲存其他任意型別,但如果使用到類似append
擴容原變數的語句,而不是使用直接替換的話,原子操作也是會失效的。
以下是節選自《Go並行程式設計實戰》一書中的例子,比較並交換(Compare And Swap)簡稱CAS,是樂觀鎖的核心思想,所以簡單介紹一下。
var xInt32 int32 for { v := atomic.LoadInt32(&xInt32) if atomic.CompareAndSwapInt32(&xInt32, v, v+100) { break } } print(xInt32)
1.最常用原子操作中的修改、基本型別的值賦值,其他不常用
2.在其他型別出現並行的時候儘可能使用sync
包提供的並行安全的型別,下一節講。
3.通過通訊共用記憶體;不要通過共用記憶體進行通訊。儘量使用通道。
到此這篇關於Go語言並行之原子操作詳解的文章就介紹到這了,更多相關Go語言原子操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45