sync.Cond

问题描述 投票:0回答:0

为什么

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
go
© www.soinside.com 2019 - 2024. All rights reserved.