为什么
writer
函数结束后调用互斥锁方法?据我所知,Broadcast()
锁定了互斥量,但是到那时它已经被锁定了。在我看来,应该触发恐慌,因为我正在锁定锁定的互斥量。为什么不出现?为什么Lock()
在这种情况下发生在Unlock()
之后?
func TestWait(t *testing.T) {
lk := sync.RWMutex{}
cond := sync.Cond{L: &lk}
writer := func() {
lk.Lock()
defer func() {
fmt.Println("write unlock")
lk.Unlock()
}()
/// some work, example: someMap[key] = value
cond.Broadcast()
time.Sleep(2 * time.Second)
}
lk.Lock()
defer lk.Unlock()
go writer()
time.Sleep(1 * time.Second)
cond.Wait()
fmt.Println("cond lock")
time.Sleep(time.Second)
}
结果:
write unlock
cond lock