Junior
221
questionbank

Что такое дедлоки?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Дедлок (deadlock) в Golang возникает, когда две или более горутины оказываются в состоянии ожидания друг друга, так что ни одна из них не может продолжить выполнение. Это происходит, когда группа горутин одновременно ожидают освобождения ресурсов, которые удерживаются другими горутинами из этой же группы.

Наиболее распространенные причины дедлоков в Golang связаны с использованием каналов:

  • Отправка в незабуферизированный канал, когда нет принимающей горутины: Горутина, отправляющая данные, заблокируется до появления получателя. Если получателя нет, и ни одна другая горутина не может его создать или принять данные, возникает дедлок.
  • Прием из незабуферизированного канала, когда нет отправляющей горутины: Горутина, принимающая данные, заблокируется до появления отправителя. Если отправителя нет, и ни одна другая горутина не может отправить данные, возникает дедлок.
  • Отправка в заполненный буферизированный канал: Горутина заблокируется, пока в канале не появится место.
  • Прием из пустого буферизированного канала: Горутина заблокируется, пока данные не появятся в канале.

Если все горутины в программе заблокированы и ожидают друг друга, среда выполнения Golang обнаружит этот дедлок и завершит программу с сообщением об ошибке.

Пример простейшего дедлока с использованием канала:

go

Пример дедлока с двумя горутинами и двумя каналами (классический "философы за столом"):

go

Обнаружение и предотвращение дедлоков требует тщательного анализа взаимодействия горутин и правильного использования примитивов синхронизации, таких как каналы и mutex'ы.