同时调用`sync.Cond`的`Wait()`方法是否安全?

根据文档,是否调用了安全的Wait()方法sync.Cond,它Unlock()首先执行?


假设我们正在检查要满足的条件:


func sample() {

    cond = &sync.Cond{L: &sync.Mutex{}} // accessible by other parts of program


    go func() {

        cond.L.Lock()

        for !condition() {

            cond.Wait()

        }

        // do stuff ...

        cond.L.Unlock()

    }()


    go func() {

        cond.L.Lock()

        mutation()

        cond.L.Unlock()


        cond.Signal()

    }()

}

和:


func condition() bool {

    // assuming someSharedState is a more complex state than just a bool

    return someSharedState

}


func mutation() {

    // assuming someSharedState is a more complex state than just a bool

    // (A) state mutation on someSharedState

}

既然Wait()执行了Unlock,那么 (A) 应该有自己的锁定吗?还是原子性?


元芳怎么了
浏览 163回答 1
1回答

神不在的星期二

是的,Wait即使在它L.Unlock()首先调用时调用也是安全的,但是在调用Wait之前和检查条件之前获取锁是必不可少的,因为在这种情况下,两者都不是线程安全的。Wait原子地解锁c.L 并暂停调用 goroutine 的执行。稍后恢复执行后,返回前Wait锁定c.L。调用的 goroutineWait获取了锁,检查了条件,发现不满意。现在它等待,但为了允许条件的变化,它需要返回锁定。Wait自动为您执行此操作,然后挂起 goroutine。现在条件可能发生变化,最终 goroutine 被Broadcastor唤醒Signal。然后它获取锁以再次检查条件(这必须对每个等待的 goroutine 一一进行,否则将无法知道现在有多少 goroutine 自由运行)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go