Sobes.tech
Junior — Middle

Դուք հանդիպե՞լ եք փոխադարձ փակման խնդիրների բազմաֆունկցիոնալ համակարգեր մշակելիս։

sobes.tech AI

Պատասխան AI-ից

Այո, բազմամյա համակարգեր մշակելիս ես հանդիպել եմ deadlock (մահվան փակուղի) խնդրին: Դա այն իրավիճակն է, երբ երկու կամ ավելի թելեր հավերժորեն փակվում են միմյանց վրա, սպասելով, որ ազատեն ռեսուրսները, որոնք զբաղեցված են մյուս կողմից:

Deadlock-ներից խուսափելու համար, ես կիրառում եմ հետևյալ պրակտիկաները:

  • Միշտ միաժամանակ մի քանի փակուղի ձեռք բերել նույն կարգով:
  • Կրճատել փակուղիների պահման ժամանակը:
  • Օգտագործել ժամանակային սահմանափակումներ փորձելիս փակուղիներ ձեռք բերելու:
  • Օգտագործել բարձր մակարդակի սինխրոնիզացիայի primitives, օրինակ, Go-ի ալիքները:

Օրինակ, Go-ում պարզ deadlock-ի օրինակ:

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-ների ձեռքբերման կարգը: