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)
}
Же жипке коопсуз структураларды колдонуу.