Sobes.tech
Senior

Անվտանգ է մրցակցային մուտքը սլայսին: Կլինի Race condition, եթե 4 goroutines փոխեն յուրաքանչյուրը իրենց յուրահատուկ ինդեքսը սլայսում?

sobes.tech AI

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

Go-ում, համաժամանակյա մուտքը սլայսին ինքնին անվտանգ չէ, քանի որ սլայսը կառուցվածք է, որը պարունակում է ցուցիչ զանգվածի վրա, երկարություն և կարողություն։ Սակայն, եթե 4 գորուտիներ փոխում են յուրաքանչյուրը իրենց յուրահատուկ ինդեքսը սլայսում և միաժամանակ չեն փոխում երկարությունը կամ կարողությունը, ապա մրցավազքի պայմաններ (race condition) չեն լինի, քանի որ յուրաքանչյուր գորուտին աշխատում է առանձին տարրով:

Կարևոր է, որ՝

  • Սլայսը նախապես հատկացված լինի անհրաժեշտ չափի:
  • Խաղարկության ժամանակ սլայսի կառուցվածքը փոխելու (օրինակ՝ append) չլինի:

Օրինակ՝

s := make([]int, 4)
var wg sync.WaitGroup
wg.Add(4)
for i := 0; i < 4; i++ {
    go func(i int) {
        defer wg.Done()
        s[i] = i * 10
    }(i)
}
wg.Wait()

Այս օրինակով, մրցավազքի պայմաններ չեն լինի, քանի որ յուրաքանչյուր գորուտին գրում է յուրահատուկ ինդեքսում:

Եթե միաժամանակ մի քանի գորուտին կարող են փոխել սլայսի երկարությունը կամ աշխատել նույն ինդեքսով, անհրաժեշտ է սինխրոնիզացիա։