Junior — Middle
Aké metódy umožňujú predchádzať vzájomnému zablokovaniu pri použití mutexov v rámci jednej funkcie?
sobes.tech AI
Odpoveď od AI
Aby ste predišli međusobnom blokiranju (deadlock) pri korišćenju mutexa unutar iste funkcije u Go, možete koristiti sledeće metode:
- Izbegavajte ponovno sticanje istog mutexa: ako je mutex već zaključan, nemojte pokušavati da ga ponovo stičete u istom thread-u.
- Koristite
sync.RWMutexumestosync.Mutex, ako su moguće samo operacije čitanja, kako biste smanjili blokade. - Organizujte kod tako da sticanje mutexa ide u istom redosledu, ako se stiče više mutexa.
- Koristite
TryLock(kroz spoljne biblioteke ili sopstvenu implementaciju), da biste pokušali da stičete mutex bez blokiranja, i u slučaju neuspeha, obradite situaciju na drugi način.
Primer bezbednog korišćenja mutexa:
var mu sync.Mutex
func safeFunction() {
mu.Lock()
defer mu.Unlock()
// kritična sekcija
}
Važno je da ne pozivate mu.Lock() ponovo u istoj gorutini bez Unlock(), jer može doći do deadlock-a.