Sobes.tech
Middle+

Ինչ կցուցադրվի ծրագրի գործարկման ժամանակ. func main() { counter := make([]int, 0, 1000) var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() counter = append(counter, i) time.Sleep(10 * time.Millisecond) // Աշխատանքի իմիտացիա }() } wg.Wait() fmt.Println(len(counter)) }

sobes.tech AI

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

Ծրագիրը պարունակում է տվյալների մրցավազք counter հատվածում մի քանի goroutine-ներից առանց սինխրոնիզացիայի։ Սա հանգեցնում է կանխատեսելի olmayan վարքագծի։

Ինչ է տեղի ունենում՝

  • Ստեղծվում է counter հատվածը երկարությամբ 0 և ծավալով 1000։
  • Սկսվում է 1000 goroutine, յուրաքանչյուրը փորձում է ավելացնել i արժեքը հատվածին։
  • append գործողությունը չի ապահովված հոսքերի համար, մի քանի goroutine-ներ միաժամանակ փոփոխում են հատվածը։
  • Տվյալների մրցավազքի պատճառով կարող է լինել տվյալների կորուստ, հատվածի վնասում կամ panic։

Ավարտին՝

  • len(counter) արժեքը կարող է լինել փոքր 1000-ից, քանի որ որոշ գրառումներ կարող են կորցվել։
  • Կարող է լինել panic կամ սխալ ելք։

ճիշտ մոտեցումը՝ օգտագործել mutex կամ ալիք՝ մուտքի սինխրոնիզացիայի համար։

var mu sync.Mutex

for i := 0; i < 1000; i++ {
    wg.Add(1)
    go func(val int) {
        defer wg.Done()
        mu.Lock()
        counter = append(counter, val)
        mu.Unlock()
        time.Sleep(10 * time.Millisecond)
    }(i)
}

կամ օգտագործել հոսքերի համար անվտանգ տվյալների կառուցվածքներ։