Sobes.tech
Junior — Middle

Կարող է ծրագրավորման լեզվում մրցակցային ընթերցում իրականացնել սլայսից?

sobes.tech AI

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

Go լեզվում, սլայսերը (slices) հղումային տիպեր են, որոնք ցույց են տալիս հիշողության մեջ գտնվող զանգվածին: Միաժամանակյա ընթերցումը սլայսից անվտանգ է, եթե ոչ ոք չի փոխում սլայսի կամ դրա հիմքում ընկած զանգվածի պարունակությունը: Այլ կերպ ասած, եթե մի քանի goroutine-ներ միայն ընթերցում են տվյալներ նույն սլայսից առանց գրելու, դա չի առաջացնի տվյալների մրցակցություն:

Սակայն, եթե առնվազն մեկ goroutine փոխում է սլայսի տարրերը, իսկ մյուսները միաժամանակ ընթերցում կամ գրում են, ապա առաջանում է մրցակցություն և վարքագիծը անորոշ է:

Անվտանգ միաժամանակյա ընթերցման օրինակ:

slice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup
wg.Add(2)
go func() {
    defer wg.Done()
    fmt.Println(slice[0])
}()
go func() {
    defer wg.Done()
    fmt.Println(slice[1])
}()
wg.Wait()

Եթե անհրաժեշտ է միաժամանակ ընթերցել և գրել, ապա պետք է օգտագործել սինխրոնիզացիայի մեխանիզմներ (օրինակ, mutex) կամ այլ անվտանգության մեխանիզմներ։