Back to questions
OZON
Middle+
5
Что будет выведено при запуске программы: 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)) }
Companies where asked
Answer from AI
sobes.tech AI
Программа содержит гонку данных при записи в срез counter из нескольких горутин без синхронизации. Это приводит к непредсказуемому поведению.
Что происходит:
- Создаётся срез
counterс длиной 0 и ёмкостью 1000. - Запускается 1000 горутин, каждая пытается добавить значение
iв срез. - Операция
appendне потокобезопасна, несколько горутин одновременно модифицируют срез. - Из-за гонки данных возможны потеря данных, повреждение среза или паника.
На выходе:
- Значение
len(counter)может быть меньше 1000, так как некоторые записи могут быть потеряны. - Возможна паника или некорректный вывод.
Правильный подход — использовать мьютекс или канал для синхронизации доступа к срезу:
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)
}
Или использовать потокобезопасные структуры данных.