Определение максимального чётного числа с конкурентным доступом и обнаружение гонки данных

У исходника нет гарантированного максимума: goroutine не ожидаются, а проверка и запись max выполняются с гонкой. Локальная копия i эту проблему не решает.

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

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

У исходника нет гарантированного максимума: goroutine не ожидаются, а проверка и запись max выполняются с гонкой. Локальная копия i эту проблему не решает.

Подробный разбор

Ответ с пояснениями

Условие

В данном упражнении рассматривается программа, которая пытается вычислить наибольшее чётное число из диапазона от 1 до 1000, используя несколько горутин. Требуется выполнить несколько шагов:

  • Предсказать, какой результат будет выведен на экран.
  • Выявить ошибки в реализации (гонка данных, неверный итоговый результат и т.п.).
  • Предложить корректные изменения, устраняющие проблемы.
import "fmt"

func main() {
    var max int
            
    for i := 1000; i > 0; i-- {
        i := i
        go func () {
            if i%2 == 0 && i > max {
                max = i
            }
        }()
    }
    fmt.Printf("Maximum is %d",max)
}

Ответ

У исходника нет гарантированного максимума: goroutine не ожидаются, а проверка и запись max выполняются с гонкой. Локальная копия i эту проблему не решает.

Корректный параллельный вариант:

func main() {
    var maximum int
    var mu sync.Mutex
    var wg sync.WaitGroup
    for i := 1000; i > 0; i-- {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            mu.Lock()
            defer mu.Unlock()
            if i%2 == 0 && i > maximum { maximum = i }
        }(i)
    }
    wg.Wait()
    fmt.Printf("Maximum is %d", maximum)
}

Нужны fmt и sync. Защищена вся операция сравнения и обновления; результат 1000. Для такого простого диапазона последовательное вычисление проще и быстрее, чем тысяча горутин и блокировка.

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

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

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

Подробнее