Sobes.tech
Middle

Как работи условната променлива (sync.Cond) в Go?

sobes.tech AI

Отговор от AI

В езика Go, sync.Cond е условна променлива, която се използва за координиране на горутините, позволявайки на една или повече горутини да чакат настъпването на определено условие.

Основни методи:

  • Wait(): блокира текущата горутина и освобождава свързания mutex, докато не бъде извикан Signal() или Broadcast().
  • Signal(): събужда една горутина, която чака на условната променлива.
  • Broadcast(): събужда всички горутини, чакащи на условната променлива.

Пример за използване:

var mu sync.Mutex
cond := sync.NewCond(&mu)

// Горутин, която чака условието
go func() {
    mu.Lock()
    cond.Wait() // чака сигнал
    // условието е изпълнено
    mu.Unlock()
}()

// Горутин, която сигнализира
mu.Lock()
// променя състоянието, което чака първата горутина
cond.Signal() // или cond.Broadcast()
mu.Unlock()

Важно е Wait() да се извиква с блокиран mutex, и при извикване на Wait(), mutex-ът временно се освобождава, за да могат други горутини да променят състоянието и да извикат Signal() или Broadcast(). След събуждане, Wait() отново блокира mutex преди да върне.

По този начин, sync.Cond позволява ефективно синхронизиране на изпълнението на горутините въз основа на промени в състоянието.