Junior — Middle
Kas teil on olnud kogemusi vastastikuses lukustuses (Deadlock) mitme lõimega töötades?
sobes.tech AI
Vastus AI-lt
Jah, mul on kogemusi vastastikuses lukustamises (deadlock) mitme niidiga programmides. Deadlock tekib, kui kaks või enam niiti ootavad lõpmatuseni ressursside vabastamist, mida hoiab teine, mis põhjustab tööseisaku.
Näiteks, kui niit A on omandanud ressursi 1 ja ootab ressursi 2, ning niit B on omandanud ressursi 2 ja ootab ressursi 1, tekib deadlock.
Go-s võib see juhtuda mutex-ide või kanalite kasutamisel ilma korraliku sünkroniseerimiseta. Deadlocki vältimiseks on oluline:
- Alati omandada ressursid samas järjekorras.
- Kasutada timeout-e või kontekste koos tühistamisega.
- Minimeerida lukustamise aega.
Potentsiaalne deadlock näide mutex-idega:
var mu1, mu2 sync.Mutex
func f1() {
mu1.Lock()
defer mu1.Unlock()
time.Sleep(time.Second)
mu2.Lock()
defer mu2.Unlock()
// töö
}
func f2() {
mu2.Lock()
defer mu2.Unlock()
time.Sleep(time.Second)
mu1.Lock()
defer mu1.Unlock()
// töö
}
Siin võivad f1 ja f2 üksteist lukustada, kui neid kutsutakse samaaegselt.