根据https://golang.org/pkg/sync/#Cond.Wait ,必须将 Wait() 调用包装在 for 循环中,因为在第一次恢复时,据称 c.L 没有被锁定。这与上面的句子“...,Wait locks c.L before return.”相矛盾。
当运行此 code ,即使 Wait() 在没有 for 循环的情况下立即恢复执行,也不会发生运行时错误,并且 Unlock() 在未先锁定的情况下解锁时应该抛出运行时错误。
假设在 Go 中使用 Cond 时不需要 for 循环是否正确,因为使用 Cond 时没有虚假唤醒?
最佳答案
For 循环是必要的,因为当 Wait
返回,不能保证条件仍然成立。一个 Wait
调用 Broadcast
时调用唤醒或 Signal
发生。当Wait
唤醒它会锁定锁,但不能保证在锁定发生之前条件会发生变化。解锁和挂起在入口处是原子的,但唤醒和锁定不是在导出处。
关于go - Cond for 循环说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61330985/