Mikhail_RU
@Mikhail_RU
учусь

Почему код в одном случае работает, а в другом — нет и выдает ошибку?

Всем привет!

Почему этот код не работает
func main() {
	// to prevent main thread from exiting, like endless running loop waiting for condition to exit
	done := make(chan bool)

	const tickRate = 2 * time.Second

	stopper := time.After(2 * tickRate)

	<-stopper

	fmt.Println("stopper done")

	done <- true

	<-done
}

, а этот - работает
func main() {
	// to prevent main thread from exiting, like endless running loop waiting for condition to exit
	done := make(chan bool)

	const tickRate = 2 * time.Second

	stopper := time.After(2 * tickRate)

	<-stopper

	fmt.Println("stopper done")

	go func() { done <- true }()

	<-done
}

?
Ссылки на примеры:
не работает
работает
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
@Wirusnyy-chel
Канал done у вас в обоих случаях не буфферизированый - это значит что для выполнения операции записи в канал должны быть готовы и писатель (ch<-val) и читатель (<-ch).

В первом варианте у вас писатель готов совершить операцию, но у него нет читателя и этот поток исполнения ставится на паузу, до тех пор, пока не появится читатель, а читатель определён в этом же потоке поэтому его никогда не будет. Программа зависнет и может упасть с ошибкой.
Это можно поправить сделав канал буфферизированным
done := make(chan book, 1)


Второй случай работает, т.к. писатель и читатель в разных потоках и могут дождаться друг друга.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы