根据文档,首先执行Wait()时,调用sync.CondUnlock()方法是否安全?

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

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)应该拥有自己的锁定吗?还是原子的?

最佳答案

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


  • 调用Wait的goroutine获得了锁,检查了条件并发现它不令人满意。
  • 现在它正在等待,但是为了允许条件的改变,它需要将锁还给我。 Wait会自动为您执行此操作,然后挂起goroutine。
  • 现在情况可能会发生变化,最终goroutine被BroadcastSignal唤醒。然后,它获取锁以再次检查条件(必须为每个等待的goroutine一对一地进行此操作,否则将无法得知现在有多少goroutine正在自由运行)。
  • 关于multithreading - 同时调用 `Wait()`的 `sync.Cond`方法安全吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33954763/

    10-14 07:57