Sobes.tech
Back to questions
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
OZONOZON

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)
}

Или использовать потокобезопасные структуры данных.