Cond
- 结构
- l Locker
- nocopy nocopy
- notify notifyList
- 实现
- Wait()
- 先添加到通知列表(调用runtime_notifyListAdd)
- 对locker解锁
- 调用等待接收通知(调用runtime_notifyListWait)
- 内部实现就是会把协程gopark起来,使其进入等待状态
- 收到通知后解除阻塞,继续执行locker加锁操作
- Signal()
- 通知列表中的一个goroutine(runtime_notifyListNotifyOne)
- 内部实现就是最终调用goready唤醒等待列表中的第一个goroutine
- 通知列表中的一个goroutine(runtime_notifyListNotifyOne)
- Broadcast()
- 通知列表中的所有goroutine
- 注意点
- 由于Wait方法会先调用Unlock解锁,所以在调用Wait方法前务必先进行加锁操作
- Wait方法唤醒后应注意使用场景,可以使用for或if进行判断。如果唤醒后不满足条件,需要再次调用Wait方法等待,即可以使用for循环如for c.Wait() {}进行等待
- 使用场景
- 类似于达到某个条件后才能继续执行的场景,如生产消费模式,需要生产一个商品后才能获取并消费该商品