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) կամ այլ անվտանգության մեխանիզմներ։