Junior — Middle
Jakie metody pozwalają zapobiec wzajemnemu blokowaniu podczas korzystania z mutexów w jednej funkcji?
sobes.tech AI
Odpowiedź od AI
Aby zapobiec wzajemnemu blokowaniu (deadlock) podczas korzystania z mutexów w tej samej funkcji w Go, można użyć następujących metod:
- Unikać ponownego przejęcia tego samego mutexa: jeśli mutex jest już zablokowany, nie próbuj go ponownie przejąć w tym samym wątku.
- Używać
sync.RWMutexzamiastsync.Mutex, jeśli operacje są tylko do odczytu, aby zmniejszyć blokady. - Organizować kod tak, aby przejęcie mutexów odbywało się w tym samym porządku, jeśli przejmujesz kilka mutexów.
- Używać
TryLock(przez biblioteki zewnętrzne lub własną implementację), aby próbować przejąć mutex bez blokowania, i obsłużyć sytuację w przypadku niepowodzenia.
Przykład bezpiecznego użycia mutexa:
var mu sync.Mutex
func safeFunction() {
mu.Lock()
defer mu.Unlock()
// sekcja krytyczna
}
Ważne jest, aby nie wywoływać mu.Lock() ponownie w tej samej goroutine bez Unlock(), w przeciwnym razie może dojść do deadlocka.