Вопрос проверяет понимание проблем синхронизации и работы с разделяемым состоянием в многопоточном окружении.
Основная проблема счётчика в многопоточном коде — состояние гонки. Несколько потоков могут одновременно читать и изменять значение, из-за чего итоговый результат будет некорректным. Такие ошибки сложно воспроизводить и отлаживать. Для безопасной работы требуется синхронизация доступа.
Счётчик кажется простой конструкцией, но в многопоточном коде он становится источником серьёзных ошибок.
Операция увеличения счётчика:
не является атомарной
состоит из чтения, изменения и записи
Если два потока выполняют её одновременно, изменения могут потеряться.
var counter = 0
DispatchQueue.global().async {
counter += 1
}
DispatchQueue.global().async {
counter += 1
}
Ожидаемое значение — 2, но результат не гарантирован.
некорректные данные
нестабильное поведение
трудноуловимые баги
синхронизировать доступ
использовать атомарные операции
изолировать состояние
Любой разделяемый счётчик в многопоточном коде требует явной защиты. Без неё поведение программы становится непредсказуемым.