Объясните, что из себя представляет условная переменная и как она используется для синхронизации потоков?
Answer from AI
sobes.tech AI
Условная переменная (condition variable) — это механизм синхронизации потоков, который позволяет одному или нескольким потокам ожидать наступления определённого условия, пока другой поток не уведомит их об изменении состояния.
В Go условные переменные реализуются через тип sync.Cond. Она работает вместе с мьютексом (sync.Mutex), который защищает общие данные. Поток, который хочет ждать, вызывает Wait(), при этом он освобождает мьютекс и блокируется до тех пор, пока другой поток не вызовет Signal() (для пробуждения одного потока) или Broadcast() (для пробуждения всех ожидающих).
Пример использования:
var mu sync.Mutex
cond := sync.NewCond(&mu)
sharedDataReady := false
// Поток, который ждёт
mu.Lock()
for !sharedDataReady {
cond.Wait() // освобождает mu и ждёт сигнала
}
// Здесь sharedDataReady == true
mu.Unlock()
// Поток, который изменяет состояние
mu.Lock()
sharedDataReady = true
cond.Signal() // или cond.Broadcast(), чтобы разбудить ожидающих
mu.Unlock()
Таким образом, условная переменная помогает организовать корректное ожидание и уведомление между потоками, избегая активного опроса и гонок данных.