Cond是一种不太常用的并发原语,之所以不太常用,是因为大部分情况下我们可以使用channel或者是waitgroup代替,并且Cond使用起来不是特别简单,有一些限制。
Cond的主要作用是:为等待 / 通知场景下的并发问题提供支持,其使用的时候需要关联一个locker,一般使用mutex或者是rwmutex
Cond一共提供了三个方法:
1)Broadcast:用于通知所有阻塞的waiter,不需要加锁
2)Signal:用于通知某一个等待的waiter,不需要加锁
3)Wait:将调用者加入到等待队列,直到被唤醒,使用的时候需要加锁
Cond使用的复杂性主要体现在:
1)有时候要加锁,有时候不加
2)Wait唤醒时需要检查条件才能继续执行
3)条件变量的修改,需要加锁
Cond与WaitGroup的主要区别是使用场景的不同,WaitGroup只能用在主子goroutine之间的同步,而Cond是等待某个条件成立,和goroutine没有关系
与Channel相比,Cond和一个Locker关联,可以利用这个Locker对相关的依赖条件更改提供保护,而Channel则不具备,Cond可以同时支持Signal和Broadcast方法,而Channel只能同时支持其中一种,Cond的Broadcast方法可以被重复调用。等待条件再次变成不满足的状态后,我们又可以调用Broadcast再次唤醒等待的 goroutine。 Channel不能支持的,Channel被close掉了之后不支持再open
此文章为2月Day13学习笔记,内容来源于极客时间《Go 并发编程实战课》