Sobes.tech
Back to questions
Junior — Middle
84

Каким образом обеспечить взаимное исключение при использовании двух объектов типа Mutex?

Answer from AI

sobes.tech AI

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

Чтобы обеспечить корректное взаимное исключение при использовании двух Mutex, нужно:

  1. Всегда захватывать мьютексы в одном и том же порядке во всех горутинах.
  2. Если возможно, объединить данные, защищаемые двумя мьютексами, под одним мьютексом.

Пример правильного порядка захвата двух мьютексов:

var mu1, mu2 sync.Mutex

func safeFunction() {
    mu1.Lock()
    defer mu1.Unlock()

    mu2.Lock()
    defer mu2.Unlock()

    // Критическая секция, защищённая двумя мьютексами
}

Если другая горутина также захватывает mu1, а потом mu2, то взаимоблокировки не будет.

Если порядок захвата разный, возможен deadlock. Поэтому главное правило — согласованный порядок захвата мьютексов.