Точное значение не гарантировано: total++ — несинхронизированная операция чтения-изменения-записи, а Sleep не устанавливает ожидание завершения. Возможны потерянные увеличения и data race.
Какой результат выведет программа с горутинами №23
Точное значение не гарантировано: total++ — несинхронизированная операция чтения-изменения-записи, а Sleep не устанавливает ожидание завершения. Возможны потерянные увеличения и data race.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Каким будет вывод программы, использующей несколько горутин?
var total = 0
func main() {
for idx := 0; idx < 10; idx++ {
go func() { total++ }()
}
time.Sleep(2 * time.Second)
fmt.Println(total)
}
Ответ
Точное значение не гарантировано: total++ — несинхронизированная операция чтения-изменения-записи, а Sleep не устанавливает ожидание завершения. Возможны потерянные увеличения и data race.
Защитите увеличение mutex либо используйте atomic.Int64.Add. Затем дождитесь всех десяти горутин через WaitGroup и только после этого прочитайте счётчик. Одна атомарность без ожидания не гарантирует итог 10 на момент печати; одно ожидание без защиты не убирает потерянные обновления.