Как mutex и небуферизированный канал создают дедлок

A ждёт получателя канала, удерживая mutex; B ждёт mutex и не может дойти до чтения. Получается цикл ожидания, который ни одна сторона не разрывает.

Короткий ответ

Что ответить на собеседовании

A ждёт получателя канала, удерживая mutex; B ждёт mutex и не может дойти до чтения. Получается цикл ожидания, который ни одна сторона не разрывает.

Подробный разбор

Ответ с пояснениями

Условие

Goroutine A держит mutex и отправляет в небуферизированный ch. Goroutine B сначала пытается взять тот же mutex, а затем читает ch. Почему выполнение останавливается?

Ответ

A ждёт получателя канала, удерживая mutex; B ждёт mutex и не может дойти до чтения. Получается цикл ожидания, который ни одна сторона не разрывает.

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

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее