A ждёт получателя канала, удерживая mutex; B ждёт mutex и не может дойти до чтения. Получается цикл ожидания, который ни одна сторона не разрывает.
Как mutex и небуферизированный канал создают дедлок
A ждёт получателя канала, удерживая mutex; B ждёт mutex и не может дойти до чтения. Получается цикл ожидания, который ни одна сторона не разрывает.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Goroutine A держит mutex и отправляет в небуферизированный ch. Goroutine B сначала пытается взять тот же mutex, а затем читает ch. Почему выполнение останавливается?
Ответ
A ждёт получателя канала, удерживая mutex; B ждёт mutex и не может дойти до чтения. Получается цикл ожидания, который ни одна сторона не разрывает.
Вынесите блокирующую отправку за пределы критической секции, заранее получив нужный снимок данных. Либо измените порядок операций с ясным протоколом владения. Добавление буфера может только замаскировать проблему до его заполнения. Для остановки фоновой работы предусмотрите context, но он не заменяет устранение неверного порядка блокировок.