Sobes.tech
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.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.