Sobes.tech
Back to questions
Junior — Middle
89

Объясните, что из себя представляет условная переменная и как она используется для синхронизации потоков?

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()

Таким образом, условная переменная помогает организовать корректное ожидание и уведомление между потоками, избегая активного опроса и гонок данных.