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

Что такое дедлок? Как его избежать?

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

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

sobes.tech AI

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

Чтобы избежать дедлоков:

  • Избегайте циклического ожидания ресурсов — всегда захватывайте мьютексы в одном и том же порядке.
  • Используйте таймауты или контексты с отменой при ожидании блокировок.
  • Минимизируйте время удержания блокировок.
  • В Go внимательно следите за операциями с каналами: не блокируйтесь на отправке или приёме без гарантии, что другая сторона готова.

Пример дедлока с каналами:

ch := make(chan int)

func main() {
    ch <- 1 // блокируется, потому что никто не читает
    <-ch
}

Чтобы избежать, нужно читать из канала в отдельной горутине или использовать буферизированный канал.