我对Go中条件变量的行为感到困惑。在主goroutine中,我获取锁并在for循环中调用Cond.Wait()检查共享内存。在工作的goroutine中,我获取锁并修改共享内存,然后广播。我注意到,当Cond.Wait()恢复时,它将在返回之前首先尝试获取锁。但是,Cond.Broadcast()不会释放锁。所以如果我在广播前没有自己解锁,不应该出现死锁吗?我读了一些使用sync.Cond的代码,发现它不是必要的,但不知道为什么。
Cond.Wait()
Cond.Broadcast()
sync.Cond
iyr7buue1#
在修改共享变量时必须保持锁。当一个goroutine调用Wait时,锁被解锁,所以另一个goroutine可以锁定它并修改共享变量。当你调用Broadcast时,这个goroutine可能会也可能不会保持锁。如果goroutine保留了锁,等待的goroutine会醒来,等待直到它们可以获得锁。当你解锁时,一个等待的goroutine可以获取锁并继续。所以,只要广播goroutine最终释放锁,就不会有死锁。
Wait
Broadcast
1条答案
按热度按时间iyr7buue1#
在修改共享变量时必须保持锁。当一个goroutine调用
Wait
时,锁被解锁,所以另一个goroutine可以锁定它并修改共享变量。当你调用Broadcast
时,这个goroutine可能会也可能不会保持锁。如果goroutine保留了锁,等待的goroutine会醒来,等待直到它们可以获得锁。当你解锁时,一个等待的goroutine可以获取锁并继续。所以,只要广播goroutine最终释放锁,就不会有死锁。