Back to questions
Junior — Middle
84
Каким образом обеспечить взаимное исключение при использовании двух объектов типа Mutex?
Answer from AI
sobes.tech AI
В Go для обеспечения взаимного исключения при работе с несколькими Mutex важно избегать взаимных блокировок (deadlock), которые могут возникнуть, если два горутины пытаются захватить два мьютекса в разном порядке.
Чтобы обеспечить корректное взаимное исключение при использовании двух Mutex, нужно:
- Всегда захватывать мьютексы в одном и том же порядке во всех горутинах.
- Если возможно, объединить данные, защищаемые двумя мьютексами, под одним мьютексом.
Пример правильного порядка захвата двух мьютексов:
var mu1, mu2 sync.Mutex
func safeFunction() {
mu1.Lock()
defer mu1.Unlock()
mu2.Lock()
defer mu2.Unlock()
// Критическая секция, защищённая двумя мьютексами
}
Если другая горутина также захватывает mu1, а потом mu2, то взаимоблокировки не будет.
Если порядок захвата разный, возможен deadlock. Поэтому главное правило — согласованный порядок захвата мьютексов.