РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
851 of 1593 menu

Метод sync.Cond.Wait

Метод sync.Cond.Wait приостанавливает выполнение текущей горутины и освобождает блокировку мьютекса, связанного с условной переменной. После получения сигнала (через Signal или Broadcast) горутина пробуждается и снова захватывает блокировку. В первый параметр метод не принимает аргументов. Он должен вызываться только внутри критической секции, защищенной мьютексом условной переменной.

Синтаксис

c.Wait()

Пример

Давайте рассмотрим базовый пример использования sync.Cond.Wait для ожидания выполнения условия:

package main import ( "fmt" "sync" ) func main() { var mu sync.Mutex cond := sync.NewCond(&mu) ready := false // Горутина, которая будет ожидать сигнала go func() { mu.Lock() for !ready { cond.Wait() } fmt.Println("Goroutine is ready") mu.Unlock() }() // Основная горутина, которая меняет условие и отправляет сигнал mu.Lock() ready = true cond.Signal() mu.Unlock() // Небольшая задержка, чтобы горутина успела выполниться var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() // Ожидаем завершения работы горутины }() wg.Wait() }

Результат выполнения кода:

"Goroutine is ready"

Пример

Рассмотрим пример с несколькими ожидающими горутинами и использованием Broadcast:

package main import ( "fmt" "sync" ) func main() { var mu sync.Mutex cond := sync.NewCond(&mu) counter := 0 // Три горутины, ожидающие сигнала for i := 0; i < 3; i++ { go func(id int) { mu.Lock() for counter < 5 { cond.Wait() } fmt.Printf("Goroutine %d: counter = %d\n", id, counter) mu.Unlock() }(i) } // Основная горутина изменяет состояние и отправляет широковещательный сигнал mu.Lock() counter = 10 cond.Broadcast() mu.Unlock() // Задержка для завершения всех горутин var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() }() wg.Wait() }

Результат выполнения кода:

"Goroutine 2: counter = 10" "Goroutine 0: counter = 10" "Goroutine 1: counter = 10"

Смотрите также

  • функцию sync.NewCond,
    которая создает новую условную переменную
  • метод sync.Cond.Signal,
    который пробуждает одну ожидающую горутину
  • метод sync.Cond.Broadcast,
    который пробуждает все ожидающие горутины
  • тип sync.Cond,
    который представляет условную переменную в Go
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить