<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
並行安全,就是多個並行體在同一段時間記憶體取同一個共用資料,共用資料能被正確處理。
很多語言的並行程式設計很容易在同時修改某個變數的時候,因為操作不是原子的,而出現錯誤計算,比如一個加法運算使用中的變數被修改,而導致計算結果出錯,典型的像統計商品庫存。
個人建議只要涉及到共用變數統統使用channel
,因為channel
原始碼中使用了互斥鎖,它是並行安全的。
我們可以不用,但不可以不瞭解,手中有糧心中不慌。
陣列是並行不安全的,在例子開始前我們要知道append
函數的行為:長度足夠在原陣列cap
內追加函數,增加len
,長度不夠則觸發擴容,申請新陣列cap
增加一倍,賦值遷移。
所以在這個過程中,僅討論擴容操作的話可能存在同時申請並賦值的情況,導致漏掉某次擴容增加的資料。
var s []int func appendValue(i int) { s = append(s, i) } func main() { for i := 0; i < 10000; i++ { //10000個協程同時新增切片 go appendValue(i) } time.Sleep(2) fmt.Println(len(s)) }
比如上例,10000
個協程同時為切片增加資料,你可以嘗試執行一下,列印出來的一定不是 10000
。
常見於控制商品減庫存,控制餘額增減等情況。 那麼有什麼辦法解決競態問題呢?
goroutine
可以存取。這兩個思路貫穿了無數的高並行/分散式方案,區別是在一個程序應用中使用,還是藉助某些第三方手段來實現,比如中介軟體。獨孤九劍森羅萬象一定要牢牢記住。
Go
語言中互斥鎖的用法如下:
var lock sync.Mutex //互斥鎖 lock.Lock() //加鎖 s = append(s, i) lock.Unlock() //解鎖
在存取臨界區的前後加上互斥鎖,就可以保證不會出現並行問題。
我們修改還是上一個4.7.1
的例子,為其增加互斥鎖。
var s []int var lock sync.Mutex appendValueSafe := func(i int) { lock.Lock() s = append(s, i) lock.Unlock() } for i := 0; i < 10000; i++ { //10000個協程同時新增切片 go appendValueSafe(i) } time.Sleep(2) fmt.Println(len(s))
s
的寫入操作加互斥鎖,保證同一時刻只有一個goroutine
修改內容。10000
,不會再出現競態問題。互斥鎖是完全互斥的,並行讀沒有修改的情況下是不會有問題的,也沒有必要在並行讀的時候加鎖不然效率會變低。
用法:
rwlock sync.RWMutex //讀鎖 rwlock.RLock() rwlock.RUnlock() //寫鎖 rwlock.Lock() rwlock.Unlock()
並行讀不互斥可以同時,在一個寫鎖獲取時,其他所有鎖都等待, 口訣:讀讀不互斥、讀寫互斥、寫寫互斥。具體測算速度的程式碼可以見4.7.3的原始碼,感興趣的可以改下注釋位置看下效率是有很明顯的提升的。
sync.Mutex
, 讀寫鎖:sync.RWMutex
都是 sync
包的。問題:只加寫鎖可以嗎?為什麼?
到此這篇關於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