日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go的sync.Mutex(七):互斥锁锁定一个资源 只有一个协程操作其他等待

發布時間:2024/9/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go的sync.Mutex(七):互斥锁锁定一个资源 只有一个协程操作其他等待 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

多個協程會操作一個特定資源,就會出現意想不到的錯誤類比臟讀幻讀等,所以我們使用互斥鎖,

一個協程使用特定資源的時候進行鎖定,用完解鎖,

再讓其他協程使用,所以其他協程想使用此資源,必須自己給資源解鎖或等待正在使用的協程解鎖

在代碼中就是鎖定一段代碼,代碼里面有資源。

注意

  • 在一個 goroutine 獲得 Mutex 后,其他 goroutine 只能等到這個 goroutine 釋放該 Mutex
  • 使用 Lock() 加鎖后,不能再繼續對其加鎖,直到利用 Unlock() 解鎖后才能再加鎖
  • 在 Lock() 之前使用 Unlock() 會導致 panic 異常
  • 已經鎖定的 Mutex 并不與特定的 goroutine 相關聯,這樣可以利用一個 goroutine 對其加鎖,再利用其他 goroutine 對其解鎖
  • 在同一個 goroutine 中的 Mutex 解鎖之前再次進行加鎖,會導致死鎖
  • 適用于讀寫不確定,并且只有一個讀或者寫的場景

參考

https://www.cnblogs.com/shockerli/p/golang-pkg-mutex.html

代碼

package mainimport ("fmt""sync""time" )func ccc(i int)(){mutex.Lock()fmt.Println("Lock:", i)time.Sleep(time.Second)fmt.Println("Unlock:", i)mutex.Unlock()defer wait.Done() } var mutex sync.Mutex var wait = sync.WaitGroup{}func main() {fmt.Println("互斥鎖")mutex.Lock()for i := 1; i <= 3; i++ {wait.Add(1)go ccc(i)}mutex.Unlock()wait.Wait() }// 互斥鎖鎖定一個資源 // 其他的協程無法進行操作此段的資源 其他的協程都選擇等待此段鎖代碼的結束 // 這個資源已經被當前的協程進行鎖定,其他的協程也要操作此資源的都要等待 // 鎖是表明一段代碼中只能同步執行的 // 互斥鎖 // Lock: 1 // Unlock: 1 // Lock: 3 // Unlock: 3 // Lock: 2 // Unlock: 2

?

總結

以上是生活随笔為你收集整理的Go的sync.Mutex(七):互斥锁锁定一个资源 只有一个协程操作其他等待的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。