sync.Cond用于goroutine之间的协作,用于协程的挂起和唤醒。
结构体
type Cond struct {
noCopy noCopy // noCopy可以嵌入到结构中,在第一次使用后不可复制,使用go vet作为检测使用
L Locker // 根据需求初始化不同的锁,如*Mutex 和 *RWMutex
notify notifyList // 通知列表,调用Wait()方法的goroutine会被放入list中,每次唤醒,从这里取出
checker copyChecker // 复制检查,检查cond实例是否被复制
}
相关函数
Wait函数
func (c *Cond) Wait() {
// 检查c是否是被复制的,如果是就panic
c.checker.check()
// 将当前goroutine加入等待队列
t := runtime_notifyListAdd(&c.notify)
// 解锁
c.L.Unlock()
// 等待队列中的所有的goroutine执行等待唤醒操作
runtime_notifyListWait(&c.notify, t)
c.L.Lock()
}
功能: 必须获取该锁之后才能调用Wait()方法,Wait方法在调用时会释放底层锁Locker,并且将当前goroutine挂起,直到另一个goroutine执行Signal或者Broadcase,该goroutine才有机会重新唤醒,并尝试获取Locker,完成后续逻辑。

本文深入解析了Go语言中sync.Cond的作用及其实现原理,详细介绍了Wait、Signal和Broadcast三个核心函数的功能与使用场景。通过示例代码展示了如何利用sync.Cond实现goroutine之间的协作,包括挂起与唤醒机制。
最低0.47元/天 解锁文章
282

被折叠的 条评论
为什么被折叠?



