简介
首先看下源码注释
Cond的主要作用是:当条件变量(一般为共享资源,堆上的变量等)改变时,通知其他由于条件变量不满足而阻塞的线程可以继续工作了。
打个比方:等红绿灯,只有看到绿灯亮了的时候,我们才能过马路。
代码示例
var sharedRsc = false
func tCond1() {
var wg sync.WaitGroup
wg.Add(2)
m := sync.Mutex{}
c := sync.NewCond(&m)
go func() {
c.L.Lock()
for sharedRsc == false {
fmt.Println("goroutine1 wait")
c.Wait()
}
//c.Wait()
fmt.Println("goroutine1 ", sharedRsc)
c.L.Unlock()
wg.Done()
}()
go func() {
c.L.Lock()
for sharedRsc == false {
fmt.Println("goroutine2 wait")
c.Wait()
}
fmt.Println("goroutine2", sharedRsc)
c.L.Unlock()
wg.Done()
}()
// 主动延时
time.Sleep(2 * time.Second)
c.L.Lock()
fmt.Println("改变共享资源状态")
sharedRsc = true
c.Broadcast()
fmt.Println("我改好了,你们自己看着办吧")
c.L.Unlock()
wg.Wait()
}
总结
sync.Cond 的作用不是保证在同一时刻,仅有一个进程可以访问某个共享资源(mutex),而是在对应的共享资源的状态发生变化时,通知其他因此而阻塞的线程。