
本页面是极客兔兔《Go 语言高性能编程》专题中的一篇技术教程,专门讲解 Go 标准库 sync 中的条件变量 sync.Cond 的使用场景、方法定义及代码示例。源代码与数据集已上传至 Github 仓库 high-performance-go。
教程围绕 sync.Cond 展开,主要内容包括:
sync.Cond 条件变量用来协调想要访问共享资源的那些 goroutine,当共享资源的状态发生变化时,通知被互斥锁阻塞的 goroutine。sync.Mutex 通常用来保护临界区和共享资源,条件变量 sync.Cond 用来协调想要访问共享资源的 goroutine。sync.Cond 解决。func NewCond(l Locker) *Cond,创建 Cond 实例时需关联一个锁(互斥锁或读写锁)。func (c *Cond) Broadcast(),唤醒所有等待条件变量 c 的 goroutine,无需锁保护。func (c *Cond) Signal(),只唤醒任意 1 个等待条件变量 c 的 goroutine,无需锁保护。func (c *Cond) Wait(),自动释放锁 c.L 并挂起调用者所在 goroutine;被 Signal 或 Broadcast 唤醒后重新加锁并返回。调用时应使用 for !condition() 循环检查条件,而非 if,以确保条件真正满足。教程提供了一个简单例子:三个协程调用 Wait() 等待,另一个协程调用 Broadcast() 唤醒所有等待的协程。通过全局变量 done 作为受互斥锁保护的条件变量,read() 等待通知,write() 接收数据后置 done 为 true 并广播,展示了完整的协程协作流程及运行输出。
sync.Cond。