Инкремент общего счётчика из тысячи горутин
Метрику обработанных сообщений считают так:
var processed int
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
processed++
}()
}
wg.Wait()
fmt.Println(processed)
Локально печатается 1000, в поде на нескольких ядрах цифры расходятся. Какое утверждение верное?
- Всегда напечатает 1000: `wg.Wait()` синхронизирует доступ к переменной
- Всегда напечатает 1000: инкремент `int` в Go атомарен
- Напечатает число не больше 1000, значение недетерминировано — это гонка данных
- Рантайм сам обнаружит гонку и завершит программу с паникой
