场景:
生产者消费者模型中(比如一个有缓存的channel中),生产者进行生产之前去抢锁,如果缓存已满,生产者抢锁无效;消费者进行消费之前去抢锁,如果缓存为空,消费者抢锁无效。所有在抢锁之前需要进行一个判断,称之为条件变量。
sync.Cond的结构:
type Cond struct {
noCopy noCopy
// L is held while observing or changing the condition
L Locker
notify notifyList
checker copyChecker
}
其中有一把锁。
sync.Cond结构体实现的方法:
Wait() // 阻塞-加锁-解锁
Wait()一旦阻塞后,就需要唤醒才能进行抢锁,即需要Signal()或Broadcast()进行唤醒。
func (c *Cond) Wait() {
c.checker.check()
t := runtime_notifyListAdd(&c.notify)
c.L.Unlock()
runtime_notifyListWait(&c.notify, t)
c.L.Lock()
}
Signal() // 唤醒一个goroutine
func