Как понять работу sync.Cond в golang?

Всем привет, пытаюсь понять работу sync.Cond. Но что-то не получается, мой пример
c := sync.NewCond(&sync.Mutex{})
	var wg sync.WaitGroup

	wg.Add(1)
	go func() {
		wg.Done()
		c.L.Lock()
		defer c.L.Unlock()
		c.Wait()
		fmt.Println("I'm created")
	}()

	c.Signal()
	wg.Wait()


Эта строчка fmt.Println("I'm created") никогда не вызывается... Примеры других примеров нашел в книгах, но они все другие и я не могу понять сам процесс работы. По идее, я в горутине ожидаю сигнала, в конце его посылаю и горутина должна разблокироваться, но как-то не работает(. Если ставлю wg.Done в конце, то вообще получаю дедлок
  • Вопрос задан
  • 2329 просмотров
Решения вопроса 1
bitniks
@bitniks
Go/PHP/Symfony developer
Первая ошибка это вызов wg.Done сразу в начале функции. wg.Done() нужно вызывать перед завершением. Вторая ошибка это предположение, что когда мы вызываем c.Signal() мы уже дошли до c.Wait().
c := sync.NewCond(&sync.Mutex{})
var wg sync.WaitGroup

wg.Add(1)
go func() {
    defer wg.Done()
    c.L.Lock()
    defer c.L.Unlock()
    c.Wait()
    fmt.Println("I'm created")
}()

time.Sleep(1 * time.Second)		
c.Signal()
wg.Wait()

https://play.golang.org/p/fuSnDNTGYeZ

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

Войдите, чтобы написать ответ

Похожие вопросы