根据https://golang.org/pkg/sync/#Cond.Wait,必须将Wait()调用包装在for循环中,因为在第一次恢复时,c.L据称未锁定。这与“ ...,等待锁定c.L,然后返回之前”上面的句子相矛盾。
[运行此code时,即使Wait()立即恢复执行而没有for循环,也不会发生运行时错误,并且Unlock()在未先锁定就被解锁时应该抛出运行时错误。
假定在Go中使用Cond时不需要for循环是正确的,因为使用Cond时没有虚假的唤醒?
For循环是必要的,因为当Wait
返回时,不能保证条件仍然成立。当对Wait
或Broadcast
的呼叫发生时,Signal
呼叫会唤醒。当Wait
唤醒时,它将锁定锁,但不能保证在发生锁定之前条件会发生变化。解锁和挂起在入口处是原子的,但唤醒和锁定不在出口处。