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