2016-01-19 11 views
5

С11 Стандарт говорит, что для атомных типов (_Atomic), префикса и постфикса ++ и -- операций are atomic, как и сложные задания (6.5.2.4, p2.): op= (6.5.16.2, р3) ,Атомарность простого оператора присваивания

Я ничего не написал о простом задании =. Это также атомный?

Скажем, E1, E2: int, но только E1 определяется спецификатором _Atomic. Мое предположение, что это:

E1 = E2; 

эквивалентно:

atomic_store(&E1 , E2); 

Это мое предположение верно?

+2

Как этот _not_ быть атомарным. Какое состояние находится между «множеством» и «не установлено»? –

+3

@WernerVanBelle Это с точки зрения Стандарта. Представьте себе абстрактную машину. – 2501

+5

@WernerVanBelle On Atmel с avr-gcc, например, когда вы устанавливаете 16-битную переменную, сначала устанавливается старший байт, а младший байт. – Ctx

ответ

3

Следуя примеру в этом Dr Dobbs article, простым назначением атомных переменных в C11 является атомный.

Стандарт C11 (ISO/IEC 9899: 2011), раздел 6.2.6.1/9 гласит:

Грузы и магазины объектов с атомными типов выполняются с memory_order_seq_cst семантики.

В дополнении к атомному, операции, выполняемые с memory_order_seq_cst Семантики имеет один порядок наблюдаемого все потоки (иначе sequentially-consistent ordering).

Без классификатора типа _Atomic возможно присвоение неатомным. Присвоение 64-битного значения (например, long long) на 32-битной машине требует двух циклов ЦП. Если другой поток считывает значение между этими двумя циклами, они получат 4 байта старого значения и 4 байта нового значения.