Является ли запись в переменную атомарной операцией?
Может ли выражение
variable = value;
быть прервано "внутри"? То есть, может ли во время (после начала, но еще до конца) записи в переменную произойти другая запись в эту же переменную?
Может ли выражение
variable = value;
быть прервано "внутри"? То есть, может ли во время (после начала, но еще до конца) записи в переменную произойти другая запись в эту же переменную?
В общем случае, выражение
variable = value;
может быть прервано "внутри". Если variable - это переменная сложного типа, например, struct, то для реального присваивания понадобится несколько машинных операций и после каждой операции может вклиниться поток более высокого приоритета. Про атомарность можно говорить только для правильно выровненных переменных размером не больше машинного слова.
В С++, для переменных тип которых не std::atomic<T>
, во время выполнения выражения variable = value
запись и чтение этой переменной из других потоков невозможна,
т.к. иначе произошла бы гонка данных (data race), а в правильной программе на С++ гонок быть не может (иначе будет неопределенное поведение, UB).
Для переменных с типом std::atomic<T>
запись атомарна по определению атомарности в С++.