为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
元芳怎么了 2021-11-22 19:45:07
根据文档,是否调用了安全的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) 应该有自己的锁定吗?还是原子性?
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

是的,Wait即使在它L.Unlock()首先调用时调用也是安全的,但是在调用Wait之前和检查条件之前获取锁是必不可少的,因为在这种情况下,两者都不是线程安全的。

Wait原子地解锁c.L 并暂停调用 goroutine 的执行。稍后恢复执行后,返回前Wait锁定c.L

  1. 调用的 goroutineWait获取了锁,检查了条件,发现不满意。

  2. 现在它等待,但为了允许条件的变化,它需要返回锁定。Wait自动为您执行此操作,然后挂起 goroutine。

  3. 现在条件可能发生变化,最终 goroutine 被Broadcastor唤醒Signal。然后它获取锁以再次检查条件(这必须对每个等待的 goroutine 一一进行,否则将无法知道现在有多少 goroutine 自由运行)。


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信