Ожидаемое математическое число — 100000, но программа содержит data race и его не гарантирует. WaitGroup не делает counter++ атомарным.
Какой результат выведет программа №7
Ожидаемое математическое число — 100000, но программа содержит data race и его не гарантирует. WaitGroup не делает counter++ атомарным.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Каким будет вывод после выполнения следующей Go‑программы:
package main
import (
"fmt"
"sync"
)
func main (){
var counter int
var wg sync.WaitGroup
wg.Add(1000)
for i := 0; i < 1000 ; i++ {
go func(){
for j := 0; j < 100; j++ {
counter++
}
wg.Done()
}()
}
wg.Wait()
fmt.Println(counter)
}
Объясните, какой будет значение переменной counter в консоли и почему.
Ответ
Ожидаемое математическое число — 100000, но программа содержит data race и его не гарантирует. WaitGroup не делает counter++ атомарным.
Тысяча горутин выполняет по сто операций чтения-изменения-записи. Их шаги могут пересекаться и терять инкременты. WaitGroup лишь обеспечивает завершение всех работников перед финальной печатью.
Используйте mutex либо атомарный счётчик для каждого увеличения. Ещё дешевле посчитать сто операций локально и один раз добавить итог под синхронизацией. После корректной защиты результат будет 100000. Нельзя считать конкретное меньшее число устойчивым ожидаемым выводом исходной программы.