Является ли запись в переменную атомарной операцией?

Рейтинг: 1Ответов: 2Опубликовано: 13.02.2011

Может ли выражение

variable = value;

быть прервано "внутри"? То есть, может ли во время (после начала, но еще до конца) записи в переменную произойти другая запись в эту же переменную?

Ответы

▲ 2Принят

В общем случае, выражение

variable = value;

может быть прервано "внутри". Если variable - это переменная сложного типа, например, struct, то для реального присваивания понадобится несколько машинных операций и после каждой операции может вклиниться поток более высокого приоритета. Про атомарность можно говорить только для правильно выровненных переменных размером не больше машинного слова.

▲ 2

В С++, для переменных тип которых не std::atomic<T>, во время выполнения выражения variable = value запись и чтение этой переменной из других потоков невозможна,
т.к. иначе произошла бы гонка данных (data race), а в правильной программе на С++ гонок быть не может (иначе будет неопределенное поведение, UB).

Для переменных с типом std::atomic<T> запись атомарна по определению атомарности в С++.