Sobes.tech
Junior — Middle

Көп иштөөдө өз ара тоскоолдук (Deadlock) болдубу?

sobes.tech AI

AIден жооп

Ооба, мен көптөгөн жиптердүү программаларда өз ара блокировка (deadlock) менен тажрыйбам бар. Deadlock — бул эки же андан көп жиптер башка жиптер тарабынан ээлеген ресурстарды бошотконго чейин күтүп жатканы, жана бул ишти токтотууга алып келет.

Мисалы, эгер A жипи ресурсту 1 ээлеп, ресурсту 2 күтүп жатса, жана B жипи ресурсту 2 ээлеп, ресурсту 1 күтүп жатса, deadlock пайда болот.

Goда, бул mutexтер же каналдар туура синхрондоштурулбаганда болушу мүмкүн. Deadlockтан качуу үчүн:

  • Ресурстарды дайыма бир эле тартипте алуу керек.
  • Timeoutтарды же жокко чыгаруу контексттерин колдонуу.
  • Блоктоочу убакытты кыскартуу.

Мисал катары потенциалдуу deadlock менен mutexтер:

var mu1, mu2 sync.Mutex

func f1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Second)
    mu2.Lock()
    defer mu2.Unlock()
    // иштөө
}

func f2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Second)
    mu1.Lock()
    defer mu1.Unlock()
    // иштөө
}

Бул жерде, f1 жана f2 бир убакта чакырылса, бири-бирин блоктоп калышы мүмкүн.