Ответ
Condition Variable (условная переменная) — это механизм синхронизации, позволяющий потокам ожидать выполнения определённого условия. В Go реализуется через комбинацию sync.Mutex и sync.Cond.
Пример:
var mu sync.Mutex
cond := sync.NewCond(&mu)
ready := false
// Ожидание условия
go func() {
mu.Lock()
for !ready {
cond.Wait() // Разблокирует мьютекс и ждёт сигнала
}
mu.Unlock()
}()
// Изменение условия
mu.Lock()
ready = true
cond.Signal() // или Broadcast() для всех ждущих
mu.Unlock()
Ключевые моменты:
- Всегда используйте
Wait()в цикле проверки условия (spurious wakeups) - Мьютекс должен быть заблокирован перед вызовом
Wait(),Signal()илиBroadcast() Signal()будит один случайный поток,Broadcast()— все