Sobes.tech
Junior — Middle

მრავალმხრივი სისტემების განვითარებისას ხომ არ გქონიათ ურთიერთდაკეტვის პრობლემები?

sobes.tech AI

პასუხი AI-სგან

ხოლო, მრავალთხილოვანი სისტემების განვითარებაში, მე შევხვდი deadlock (მკვდარი ბლოკი) პრობლემას. ეს არის სიტუაცია, როდესაც ორი ან მეტი თხილი სამუდამოდ ბლოკავს ერთმანეთს, ელოდება რესურსების გათავისუფლებას, რომლებიც დაკავებულია ერთმანეთის მიერ.

Deadlock-ების თავიდან ასაცილებლად, მე ვრცელებ შემდეგ პრაქტიკებს:

  • ყოველთვის ერთსა და იმავე წესით რამდენიმე ბლოკის მიღება.
  • ბლოკების შენახვის დროს მინიმუმამდე დაყვანა.
  • დროის ზღვარის გამოყენება ბლოკების მიღების დროს.
  • მაღალი დონის სინქრონიზაციის primitives-ის გამოყენება, მაგალითად, Go-ის არხები.

მაგალითად, მარტივი deadlock-ის მაგალითი Go-ში:

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 შეიძლება ერთმანეთს დაბლოკონ, თუ ორივე პირველი mutex-ს მიიღებს და მეორე ელოდება. ამის თავიდან ასაცილებლად, საჭიროა mutex-ების მიღების წესის კოორდინაცია.