Объяснение
Data race возникает при несинхронизированном конфликтующем доступе к общей памяти. Atomic обеспечивает свойства отдельной операции, но не обязательно инварианта нескольких полей. Порядок памяти определяет видимость связанных записей.
Задача для самостоятельного решения
Два атомарных поля balance и reserved обновляются отдельно. Гарантирует ли это согласованный снимок?
Показать разбор ответа
Нет: читатель может увидеть новое balance и старое reserved. Для общего инварианта нужны mutex, версия снимка или специально доказанный алгоритм.