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 შეიძლება gegenseitig დაბლოკონ, თუ ერთდროულად გამოიძახება.