Является ли метод Wait()
sync.Cond
безопасным, если в соответствии с документацией он выполняет сначала Unlock()
?Вызывает метод `Wait()` `sync.Cond` одновременно, безопасно?
Предположим, мы проверяем на состояние должны быть выполнены:
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) имеет фиксирующую его собственной? Или быть атомным?
Так что 'Unlock()' не разблокирует уже заблокированный 'Cond' в другом' goroutine'? –
Глупый мне! Я уже приобрел блокировку перед вызовом 'Wait()'! –