Sobes.tech
Назад к вопросам
Middle
1

Что такое deadlock и race condition, как с ними бороться?

Компании, где спрашивали
VKVK

Ответ от нейросети

sobes.tech AI

Deadlock — ситуация, когда несколько горутин (или потоков) блокируют друг друга, ожидая освобождения ресурсов, которые заняты друг другом, и в итоге ни одна не может продолжить работу.

Race condition — состояние гонки, когда результат работы программы зависит от непредсказуемого порядка выполнения горутин, что приводит к ошибкам или некорректным данным.

Как бороться:

  • Для deadlock:

    • Избегать вложенных блокировок.
    • Использовать таймауты при захвате мьютексов.
    • Проектировать логику так, чтобы все горутины захватывали ресурсы в одном порядке.
  • Для race condition:

    • Использовать синхронизацию: мьютексы, каналы.
    • Избегать совместного доступа к изменяемым данным без защиты.
    • Использовать инструменты go race detector (go run -race) для выявления гонок.

Пример race condition:

var counter int

func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    counter++ // небезопасно без мьютекса
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println(counter) // может быть меньше 1000 из-за гонок
}

Исправление — добавить мьютекс вокруг изменения counter.