Back to questions
VK
Middle
2
Что такое deadlock и race condition, как с ними бороться?
Companies where asked
Answer from AI
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.