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