Go语言 广播前要先解锁吗

knpiaxh1  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(83)

我对Go中条件变量的行为感到困惑。
在主goroutine中,我获取锁并在for循环中调用Cond.Wait()检查共享内存。在工作的goroutine中,我获取锁并修改共享内存,然后广播。
我注意到,当Cond.Wait()恢复时,它将在返回之前首先尝试获取锁。但是,Cond.Broadcast()不会释放锁。所以如果我在广播前没有自己解锁,不应该出现死锁吗?
我读了一些使用sync.Cond的代码,发现它不是必要的,但不知道为什么。

iyr7buue

iyr7buue1#

在修改共享变量时必须保持锁。当一个goroutine调用Wait时,锁被解锁,所以另一个goroutine可以锁定它并修改共享变量。当你调用Broadcast时,这个goroutine可能会也可能不会保持锁。如果goroutine保留了锁,等待的goroutine会醒来,等待直到它们可以获得锁。当你解锁时,一个等待的goroutine可以获取锁并继续。
所以,只要广播goroutine最终释放锁,就不会有死锁。

相关问题