介绍
- Cond是一个条件锁,就是当满足某些条件下才起作用的锁,有的地方也叫定期唤醒锁,有的地方叫条件变量conditional variable。这个同步工具拿来与互斥锁一起讨论。实际上,条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用。
条件变量并不是被用来保护临界区和共享资源的,它是用于协调想要访问共享资源的那些线程的。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程.
适用场景
条件变量在这里的最大优势就是在效率方面的提升。当共享资源的状态不满足条件的时候,想操作它的线程再也不用循环往复地做检查了,只要等待通知就好了。
type Cond struct {
noCopy noCopy
// L is held while observing or changing the condition
L Locker
notify notifyList
checker copyChecker
}
// NewCond returns a new Cond with Locker l.
func NewCond(l Locker) *Cond {
return &Cond{L: l}
}
- 初始化
- Cond 是通过 NewCond 来初始化
- 方法
- 等待通知: wait
- 阻塞当前线程,直到收到该条件变量发来的通知。wati前必须先 lock。
- 单发通知: signal
- 让该条件变量向至少一个正在等待它的通知的线程发送通知,表示共享数据的状态已经改变。
- 广播通知: broadcast
- 让条件变量给正在等待它的通知的所有线程都发送通知。
栗子
func main() {
var lc = new(sync.Mutex)
var cond = sync.NewCond(lc)
for i := 0; i < 3; i++ {
go func(x int) {
//竞争锁
cond.L.Lock()
//记得要释放锁
defer cond.L.Unlock()
cond.Wait()
fmt.Println(x)
}(i)
}
time.Sleep(2 * time.Second)
cond.Signal()
cond.Broadcast()
time.Sleep(2 * time.Second)
}
运行结果
0
2
1