Сюда направлен дубликат, и его необходимо обновить. «Новый» язык C11 включает атомарный атрибут, который допускает, что:
_Atomic int a;
...
a += 3
может быть скомпилирован в (атомарный) неограниченный цикл. Спасибо за стандарты подарков, я бы очень хотел, чтобы вы этого не делали.
1: в некоторых архитектурах атомарные операции возможны только с памятью, которая поддерживает определенные протоколы доступа. ARMv7, MIPS, например, превращают последовательность в:
do {
x = LoadLinked(a) + 3;
} while !StoreConditional(x, &a);
но LoadLinked/StoreConditional не определен для некоторых типов памяти/кэша. Наслаждайтесь отладкой этого.
2: Связано с этим ложное совместное использование, которое является артефактом LoadLinked, StoreConditional, работающего со строками кэша (например, 32, 64, 256 байт), а не с подблоками. Итак: _Atomic int a[4]; может потребоваться размер строки кэша 4 * (таким образом, 1024 байта), чтобы безопасно разрешить одновременные атомарные операции с [n] и [n + 1], потому что 4 процессора могут бороться за обновление [0..3], но никогда не удается .
Будем надеяться, что следующий стандарт признает врожденную неудачу оформления атрибутов и восстановит c89 в качестве законного стандарта C.
person
mevets
schedule
26.10.2017
INC m64
как операция RMW не гарантируется атомарностью, если только не используется префиксLOCK
. - person Arne Vogel   schedule 16.11.2018