根据文档,是否调用了安全的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
。
调用的 goroutine
Wait
获取了锁,检查了条件,发现不满意。现在它等待,但为了允许条件的变化,它需要返回锁定。
Wait
自动为您执行此操作,然后挂起 goroutine。现在条件可能发生变化,最终 goroutine 被
Broadcast
or唤醒Signal
。然后它获取锁以再次检查条件(这必须对每个等待的 goroutine 一一进行,否则将无法知道现在有多少 goroutine 自由运行)。
- 1 回答
- 0 关注
- 162 浏览
添加回答
举报
0/150
提交
取消