Что вызывает пустые циклы Go for для блокировки программы? - PullRequest
0 голосов
/ 26 декабря 2018

Когда я изучал Go, я изначально писал свои короткие программы, используя пустой цикл for, чтобы заблокировать выход программы, когда я запускал свои тестовые функции с ключевым словом go.Однако по мере увеличения размера моих тестовых / обучающих программ вся программа иногда зависала в случайных местах, а отладчик отключался, что сильно затрудняло отладку.

В конце концов я узнал, что причиной был пустой цикл for из небольшого обсуждения IRC, и заменил его блокирующим каналом, но я так и не узнал, ПОЧЕМУ кроме того, что это было связано с тем, как обрабатывает Goпланирования.

Какой механизм в фоновом режиме заставляет независимые подпрограммы блокировать целые программы, даже если для программы выделено много ядер, если есть пустой бесконечный цикл for?

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Пустой цикл for не block .Это заставляет ЦП быть занятым выполнением одной и той же инструкции JMP снова и снова.Вы должны были услышать, что ваш вентилятор процессора тоже довольно быстро раскручивается.

Самый простой способ блокировать бесконечно - пустой оператор выбора:

select {}
0 голосов
/ 26 декабря 2018

Например, выпуск № 10958: время выполнения: узкие циклы должны быть вытеснены # 10958

В настоящее время подпрограммы могут быть вытеснены только в точках вызова функции.Следовательно, можно написать жесткий цикл (например, числовое ядро ​​или вращение атома) без вызовов или выделения, которые произвольно задерживают вытеснение.Это может привести к сколь угодно долгому времени паузы, поскольку сборщик мусора ожидает остановки всех программ.

В необычных ситуациях это может даже привести к тупику при попытке остановить мир.Например, TestGoroutineParallelism во время выполнения пытается предотвратить сборку GC во время теста, чтобы избежать взаимоблокировки.Он запускает несколько последовательных циклов, которые взаимодействуют через общую атомарную переменную.Если координатор, который запускает их, будет приостановлен на полпути, он заходит в тупик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...