Sobes.tech
Назад к вопросам
Middle+
1

Задача 3: Найти ошибки в коде с горутинами, map и WaitGroup

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

При работе с горутинами, map и sync.WaitGroup в Go часто встречаются следующие ошибки:

  1. Параллельный доступ к map без синхронизации — map в Go не является потокобезопасным, и одновременное чтение/запись из разных горутин приводит к панике.

  2. Неправильное использование WaitGroup — например, вызов wg.Done() меньшее или большее количество раз, чем wg.Add(), или вызов wg.Wait() до запуска всех горутин.

  3. Передача переменных цикла в горутину по ссылке — все горутины могут получить одну и ту же переменную, что приводит к неправильным результатам.

Пример исправленного кода:

var mu sync.Mutex
var wg sync.WaitGroup
results := make(map[int]int)

for i := 0; i < 10; i++ {
    wg.Add(1)
    i := i // локальная копия переменной
    go func() {
        defer wg.Done()
        value := i * 2
        mu.Lock()
        results[i] = value
        mu.Unlock()
    }()
}
wg.Wait()

Здесь:

  • Создаётся локальная копия i для каждой горутины.
  • Используется мьютекс mu для безопасного доступа к map.
  • wg.Add(1) вызывается перед запуском горутины, wg.Done() — внутри неё.

Это предотвращает гонки данных и обеспечивает корректное завершение всех горутин.