Junior — Middle
Kokios metodikos leidžia išvengti tarpusavio užblokavimo naudojant mutexus vienoje funkcijoje?
sobes.tech AI
Atsakymas iš AI
Kad išvengtumėte tarpusavio užblokavimo (deadlock) naudojant mutexus toje pačioje funkcijoje Go kalboje, galite naudoti šiuos metodus:
- Venkite pakartotinai įgyti tą patį mutexą: jei mutexas jau užrakintas, nebandykite jo vėl įgyti toje pačioje sraute.
- Naudokite
sync.RWMutexvietojesync.Mutex, jei galima tik skaitymo operacijos, kad sumažintumėte užrakinimus. - Organizuokite kodą taip, kad mutexų įgyjimas vyktų toje pačioje tvarkoje, jei įgyjate kelis mutexus.
- Naudokite
TryLock(per išorines bibliotekas ar savo įgyvendinimą), kad bandytumėte įgyti mutexą be užrakinimo ir, jei nepavyksta, tvarkykitės kitaip.
Saugus mutexo naudojimo pavyzdys:
var mu sync.Mutex
func safeFunction() {
mu.Lock()
defer mu.Unlock()
// kritinė sekcija
}
Svarbu, kad toje pačioje gorutinoje nekviestumėte mu.Lock() pakartotinai be Unlock(), kitaip gali įvykti deadlock.