欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Go的sync.Cond(四)

发布时间:2024/9/19 71 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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(四)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。