Junior — Middle
Koje metode omogućavaju sprečavanje međusobnog blokiranja prilikom korišćenja mutexa unutar iste funkcije?
sobes.tech АИ
Одговор од АИ
Da biste sprečili međusobno blokiranje (deadlock) prilikom korišćenja mutexa unutar iste funkcije u Go, možete koristiti sledeće metode:
- Izbegavajte ponovo 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.