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 бөлүмүнө бир нече горутинден жазуу учурунда маалыматтардын жарышы болуп жатат. Бул алдын ала болбогон жүрүм-турумга алып келет.

Кандай болот:

  • counter бөлүмү 0 узундук жана 1000 сыйымдуулук менен түзүлөт.
  • 1000 горутин ишке киргизилет, ар бири i маанисин бөлүмгө кошууга аракет кылат.
  • append операциясы жипке коопсуз эмес, бир нече горутин бир убакта бөлүмдү өзгөртөт.
  • Маалыматтардын жарышынын натыйжасында маалымат жоготуу, бөлүмдүн бузулушу же паника болушу мүмкүн.

Аягында:

  • len(counter) мааниси 1000дөн аз болушу мүмкүн, анткени кээ бир жазуулар жоголушу мүмкүн.
  • Паника же туура эмес чыгуу болушу мүмкүн.

Туура ыкма — 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)
}

Же жипке коопсуз структураларды колдонуу.