Skip to content

Golang面试题:Cond 是什么

1、Cond 是什么

Cond实现了一种条件变量,可以使用在多个 Reader 等待共享资源 ready 的场景(如果只有一读一写,一个锁或者 channel 就搞定了)

每个 Cond都会关联一个 Lock(sync.Mutex or sync.RWMutex),当修改条件或者调用 Wait 方法时,必须加锁,保护 condition。

2、Broadcast 和 Signal 区别

go
func (c *Cond) Broadcast()

Broadcast 会唤醒所有等待 c 的 goroutine。调用 Broadcast 的时候,可以加锁,也可以不加锁。

go
func (c *Cond) Signal()

Signal 只唤醒1 个等待 c 的 goroutine。调用 Signal 的时候,可以加锁,也可以不加锁。

3、Cond 中 Wait 使用

go
func (c *Cond) Wait()

Wait()会自动释放 c.L,并挂起调用者的 goroutine。之后恢复执行,Wait()会在返回时对 c.L 加锁。

除非被 Signal 或者 Broadcast 唤醒,否则 Wait()不会返回。

由于 Wait()第一次恢复时,C.L 并没有加锁,所以当 Wait 返回时,调用者通常并不能假设条件为真。

取而代之的是,调用者应该在循环中调用 Wait。(简单来说,只要想使用 condition,就必须加锁。)

go
 
c.L.Lock()

for !condition(){
    c.Wait() 
}

// make use of condition ...
c.L.Unlock()