Назад к вопросам
Yadro
Middle
6
Что такое дедлок? Как его избежать?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Дедлок (взаимная блокировка) — ситуация, когда два или более потоков (горутин) навсегда блокируют друг друга, ожидая освобождения ресурсов, которые заняты друг другом. В Go дедлок часто возникает при неправильном использовании каналов или мьютексов.
Чтобы избежать дедлоков:
- Избегайте циклического ожидания ресурсов — всегда захватывайте мьютексы в одном и том же порядке.
- Используйте таймауты или контексты с отменой при ожидании блокировок.
- Минимизируйте время удержания блокировок.
- В Go внимательно следите за операциями с каналами: не блокируйтесь на отправке или приёме без гарантии, что другая сторона готова.
Пример дедлока с каналами:
ch := make(chan int)
func main() {
ch <- 1 // блокируется, потому что никто не читает
<-ch
}
Чтобы избежать, нужно читать из канала в отдельной горутине или использовать буферизированный канал.