条件变量sync.Cond
如果是一个协程通知另一个协程的场景,用channel或者Mutex就可以。sync.Cond
经常用在多个 goroutine 等待,一个 goroutine 通知的场景,但是这个也能用close channel的方式实现。sync.Cond
的好处是可以多次通知,而close channel做不到,更多的讨论可以看官方的issue。下面有个简单的demo展示sync.Cond
的使用:
var done = false
func read(name string, c *sync.Cond) {
for {
c.L.Lock()
c.Wait()
if done {
log.Println(name, "starts reading")
}
c.L.Unlock()
}
}
func write(name string, c *sync.Cond) {
log.Println(name, "starts writing")
c.L.Lock()
done = true
c.L.Unlock()
log.Println(name, "wakes all")
c.Broadcast()
}
func main() {
cond := sync.NewCond(&sync.Mutex{})
go read("reader1", cond)
go read("reader2", cond)
go read("reader3", cond)
write("writer", cond)
write("writer", cond)
time.Sleep(time.Second * 3)
}