Sobes.tech
Junior — Middle

Ko'p ipli ishlashda o'zaro blokirovka (Deadlock) bilan tajribangiz bo'ldimi?

sobes.tech AI

AIdan javob

Ha, men ko'p iplikli dasturlarda o'zaro bloklanish (deadlock) bilan tajribam bor. Deadlock, ikki yoki undan ortiq iplar boshqa iplar tomonidan egallangan resurslarni bo'shatishni kutib o'tirmoqda va bu bajarilishni to'xtatib qo'yadi.

Masalan, agar A ipi 1-resursni egallagan va 2-resursni kutayotgan bo'lsa, va B ipi 2-resursni egallagan va 1-resursni kutayotgan bo'lsa, o'zaro bloklanish yuzaga keladi.

Go tilida, bu mutexlar yoki kanallarni to'g'ri sinxronizatsiya qilmasdan ishlatishda yuzaga kelishi mumkin. Deadlockdan qochish uchun:

  • Resurslarni har doim bir xil tartibda egallash.
  • Timeoutlar yoki bekor qilish bilan kontekstlardan foydalanish.
  • Bloklash vaqtini minimallashtirish.

Potensial deadlock misoli mutexlar bilan:

var mu1, mu2 sync.Mutex

func f1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Second)
    mu2.Lock()
    defer mu2.Unlock()
    // ish
}

func f2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Second)
    mu1.Lock()
    defer mu1.Unlock()
    // ish
}

Bu yerda, f1 va f2 bir vaqtning o'zida chaqirilsa, ular bir-birini bloklashi mumkin.