溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中的sync.Mutex如何使用

發(fā)布時間:2023-03-06 14:28:18 來源:億速云 閱讀:119 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Go語言中的sync.Mutex如何使用的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Go語言中的sync.Mutex如何使用文章都會有所收獲,下面我們一起來看看吧。

背景

多個協(xié)程操作中經(jīng)常出現(xiàn)臟讀寫的情況,這種情況下需要使用互斥鎖,保證在對協(xié)程共享區(qū)域操作的原子性。

如下示例:

啟動了 100個協(xié)程,每個協(xié)程累加 100 次,在沒有臟讀寫的情況下,最后結(jié)果應該是 100 * 100 = 10000

package main
import (
	"fmt"
	"sync"
)
func main() {
   var count = 0
   var wg  sync.WaitGroup
   wg.Add(100)
   for i :=0; i< 100; i++ {
      go func(){
         defer wg.Done()
         for j := 0; j< 100; j ++ {
            count ++
         }
      }()
   }
   wg.Wait()
   fmt.Println(count)
}

但是實際結(jié)果一直小于 10000

Go語言中的sync.Mutex如何使用

互斥鎖

count ++ 操作, 分為三個步驟

在協(xié)程的共享區(qū)域取出 count 當前值

當前值加一

加一后的值寫回協(xié)程共享區(qū)域

這時需要使用互斥鎖, 來保證對 count++ 的三個操作過程中沒有其他協(xié)程進行讀寫。

Go的Sync 包提供了Mutex, 讀寫互斥的鎖, 來保證只有一個協(xié)程對數(shù)據(jù)進行讀寫操作。 以保證 count++操作的原子性

如下示例:

package main
import (
	"fmt"
	"sync"
)
func main() {
   var count = 0
   // 聲明Mutex變量
   var mu sync.Mutex
   var wg  sync.WaitGroup
   wg.Add(100)
   for i :=0; i< 100; i++ {
      go func(){
         defer wg.Done()
         for j := 0; j< 100; j ++ {
            // 添加鎖
            mu.Lock()
            count ++
            // 解鎖
            mu.Unlock()
         }
      }()
   }
   wg.Wait()
   fmt.Println(count)
}

mu.Lock()mu.Unlock() 之間的代碼可以保證在操作只會被一個協(xié)程執(zhí)行。這樣執(zhí)行結(jié)果就是 10000 了

Go語言中的sync.Mutex如何使用

注意

mu.Lock()mu.Unlock() 必須成對出現(xiàn),在忘掉 Unlock 的情況下,鎖獲取后永遠不會得到釋放,其他 的線程/協(xié)程會永遠處于阻塞狀態(tài),永遠獲取不到鎖,在忘掉 Lock 的情況下,直接 Unlock 一個未加鎖的 Mutex,會導致程序 panic。

關(guān)于“Go語言中的sync.Mutex如何使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Go語言中的sync.Mutex如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI