根据文档,首先执行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)应该拥有自己的锁定吗?还是原子的? 最佳答案
是的,即使先调用Wait
也可以安全地调用L.Unlock()
,但是在调用Wait
之前和检查条件之前,必须先获取锁,因为在这种情况下,两者都不是线程安全的。
Wait
的goroutine获得了锁,检查了条件并发现它不令人满意。 Wait
会自动为您执行此操作,然后挂起goroutine。 Broadcast
或Signal
唤醒。然后,它获取锁以再次检查条件(必须为每个等待的goroutine一对一地进行此操作,否则将无法得知现在有多少goroutine正在自由运行)。 关于multithreading - 同时调用 `Wait()`的 `sync.Cond`方法安全吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33954763/