Sobes.tech
Junior — Middle

Оё дар таҳияи системҳои бисёрсоҳавӣ бо мушкилоти мутақобилан баста шудан рӯ ба рӯ шудед?

sobes.tech AI

Ҷавоб аз AI

Бале, дар таҳияи системҳои бисёрсӯроҳӣ, ман бо масъалаи deadlock (блоки марг) рӯбарӯ шудам. Ин ҳолатест, ки дар он ду ё бештар аз сӯроҳӣ ҳамеша якдигарро мепӯшонанд, интизори озод кардани захираҳое, ки дар ихтиёри дигар ҳастанд.

Барои пешгирӣ кардани deadlock-ҳо, ман амалҳои зеринро татбиқ мекунам:

  • Ҳамеша чанд блокро дар ҳамон тартиб гирифтан.
  • Вақти нигоҳ доштани блокҳоро кам кардан.
  • Ҳангоми кӯшиши гирифтани блокҳо, истифодаи timeout-ҳоро.
  • Истифодаи 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-ҳоро ҳамоҳангсозӣ кунед.