Go的sync.Cond(四)
生活随笔
收集整理的這篇文章主要介紹了
Go的sync.Cond(四)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Cond
// cond是只會執行加鎖的協程,相當于加了一個標識,
// lock與ulock是標識? 相當于門 ,讓讓正確的人(協程)進入
// wait是堵塞等待? 相當于一把鎖
// Signal會給信號疏通一個加鎖加wait協程? ? 相當于只能開一把鎖的鑰匙
// Broadcast疏通所有剩下的加鎖加wait協程? ? 相當于能夠開所有加鎖的鑰匙萬能鑰匙
文章
手冊:https://studygolang.com/static/pkgdoc/pkg/sync.htm#Cond
博文:https://blog.csdn.net/qq_35976351/article/details/82117769
代碼示例
package mainimport ("fmt""sync""time" )var locker = new(sync.Mutex) // func NewCond(l Locker) *Cond:用于創建條件,根據實際情況傳入sync.Mutex或者sync.RWMutex的 指針,一定要是指針,否則會發生復制導致鎖的失效 var cond = sync.NewCond(locker) var waitgroup sync.WaitGroupfunc test(x int) {cond.L.Lock()// cond.Wait() //有wait必須有lockfmt.Println("test",x)time.Sleep(time.Second * 1)defer func() {cond.L.Unlock() //釋放鎖waitgroup.Done() //減一個協程}() }func aaaa(x int) {cond.L.Lock()cond.Wait() //有wait必須有lockfmt.Println("aaaa",x)time.Sleep(time.Second * 1)defer func() {cond.L.Unlock() //釋放鎖waitgroup.Done() //減一個協程}() }func bbbb(x int) {fmt.Println("bbbb",x) }func main() {for i := 0; i < 5; i++ {go test(i)go aaaa(i)go bbbb(i)waitgroup.Add(1*2)}fmt.Println("Signal:")cond.Signal() //前面的cond就是表示喚醒加鎖的:加wait就是喚醒一個加鎖的協程 不加wait會喚醒所有沒堵塞的加鎖協程。time.Sleep(time.Second * 20)fmt.Println("Broadcast:") cond.Broadcast() //喚醒剩下堵塞的waitgroup.Wait() //保證所有協程執行完畢 }// 加wait的 // Signal: // 1 // Broadcast: // 4 // 2 // 0 // 3// 不加wait的 // Signal: // 1 // 0 // 3 // 4 // Broadcast: // 2// 兩個函數的協程: // 第一個函數都執行了,第二個加了wait只執行了一次 // cond是只會執行加鎖的協程,相當于加了一個標識, // lock與ulock是表示 // wait是堵塞等待 // Signal會給信號疏通一個加鎖協程 // Broadcast疏通所有剩下的加鎖協程 // Signal: // test 0 // test 1 // test 3 // test 2 // test 4 // aaaa 1 // Broadcast: // aaaa 4 // aaaa 2 // aaaa 0 // aaaa 3// 三個函數的 // Signal: // bbbb 0 // bbbb 3 // bbbb 1 // bbbb 2 // bbbb 4 // test 0 // test 1 // test 4 // test 2 // test 3 // aaaa 1 // Broadcast: // aaaa 4 // aaaa 3 // aaaa 0 // aaaa 2總結
以上是生活随笔為你收集整理的Go的sync.Cond(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 换防冻液需要清洗水箱吗
- 下一篇: 招商信用卡不能分期原因