Какой результат выведет программа №7

Ожидаемое математическое число — 100000, но программа содержит data race и его не гарантирует. WaitGroup не делает counter++ атомарным.

Короткий ответ

Что ответить на собеседовании

Ожидаемое математическое число — 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. Нельзя считать конкретное меньшее число устойчивым ожидаемым выводом исходной программы.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее