Junior — Middle
Ce metode permit evitarea blocajelor mutuale la utilizarea mutexurilor în cadrul aceleiași funcții?
sobes.tech AI
Răspuns de la AI
Pentru a preveni blocarea mutuală (deadlock) atunci când se utilizează mutex-uri în interiorul aceleiași funcții în Go, se pot folosi următoarele metode:
- Evitarea reaplicării aceluiași mutex: dacă mutex-ul este deja blocat, nu încercați să îl reaplicați în același fir de execuție.
- Utilizarea
sync.RWMutexîn loc desync.Mutex, dacă sunt posibile doar operații de citire, pentru a reduce blocajele. - Organizarea codului astfel încât achiziția mutex-urilor să se facă în aceeași ordine, dacă se achiziționează mai multe mutex-uri.
- Utilizarea
TryLock(prin biblioteci externe sau propria implementare), pentru a încerca să obțineți mutex-ul fără blocare, și tratarea situației în cazul eșecului.
Exemplu de utilizare sigură a mutex-ului:
var mu sync.Mutex
func safeFunction() {
mu.Lock()
defer mu.Unlock()
// secțiune critică
}
Este important să nu apelați mu.Lock() din nou în aceeași goroutine fără Unlock(), altfel poate apărea un deadlock.