sync包的cond实现了一种条件变量,当共享的资源未准备好时,多个goroutine挂起等待,直到一个master goroutine通知事件发生。
一、数据结构
type Cond struct {
noCopy noCopy // 实现了Locker接口,使得Cond对象在go vet扫描时能够检测出Cond对象是否被复制
L Locker // 实现了Locker接口,通常使用Mutex或RWMutex
notify notifyList // 维护了等待被唤醒的goroutine队列
checker copyChecker // 实际上是uintptr对象,保存自身对象地址
}
二、使用方法
1. NewCond
构建一个新的Cond对象,需要传入一个Locker
func NewCond(l Locker) *Cond {
return &Cond{L: l}
}
2. Wait
在调用该方法时,需保证已获得了Cond对象的锁,否则会报错
func (c *Cond) Wait() {
c.checker.check() // 检查Cond对象是否被复制
t := runtime_notifyListAdd(&c.notify) // 将当前goroutine加入等待唤醒队列
c.L.Unlock()
runtime_notifyListWait(&c.notify, t) // 将当前goroutine挂