条件变量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)
}
推荐文章: