Sobes.tech
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.RWMutex umesto sync.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.