Смоделируйте deadlock в конкурентной Go-программе с двумя горутинами.

Deadlock можно получить, если две горутины захватят два mutex в противоположном порядке. Барьер делает пример воспроизводимым, без надежды на случайный scheduling.

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

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

Deadlock можно получить, если две горутины захватят два mutex в противоположном порядке. Барьер делает пример воспроизводимым, без надежды на случайный scheduling.

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

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

Deadlock можно получить, если две горутины захватят два mutex в противоположном порядке. Барьер делает пример воспроизводимым, без надежды на случайный scheduling.

package main

import "sync"

func main() {
    var a, b sync.Mutex
    readyA, readyB := make(chan struct{}), make(chan struct{})
    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        defer wg.Done()
        a.Lock()
        defer a.Unlock()
        close(readyA)
        <-readyB
        b.Lock()
        b.Unlock()
    }()
    go func() {
        defer wg.Done()
        b.Lock()
        defer b.Unlock()
        close(readyB)
        <-readyA
        a.Lock()
        a.Unlock()
    }()
    wg.Wait()
}

Программа намеренно блокируется: каждый держит ресурс, нужный другому. Исправление — единый порядок захвата, например всегда a, затем b. Пример демонстрационный, не для запуска в рабочем сервисе.

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

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

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

Подробнее