Junior — Middle
Jaké metody umožňují zabránit vzájemnému zablokování při použití mutexů uvnitř jedné funkce?
sobes.tech AI
Odpověď od AI
Abyste předešli vzájemnému zablokování (deadlock) při používání mutexů uvnitř stejné funkce v Go, můžete použít následující metody:
- Vyhněte se opětovnému získání téhož mutexu: pokud je mutex již zablokován, nepokoušejte se ho znovu získat ve stejném vlákně.
- Použijte
sync.RWMutexmístosync.Mutex, pokud jsou možné pouze operace čtení, aby se snížilo zablokování. - Organizujte kód tak, aby získání mutexů probíhalo ve stejném pořadí, pokud je získáváno více mutexů.
- Použijte
TryLock(přes externí knihovny nebo vlastní implementaci), abyste se pokusili získat mutex bez zablokování a v případě neúspěchu situaci řešili jinak.
Příklad bezpečného použití mutexu:
var mu sync.Mutex
func safeFunction() {
mu.Lock()
defer mu.Unlock()
// kritická sekce
}
Je důležité, abyste volali mu.Lock() znovu ve stejné gorutině bez Unlock(), jinak může dojít k deadlocku.