A duplicate было направлено сюда, и это требует обновления. «Новый» язык 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] и a [n + 1], потому что 4 процессора могли бороться за обновление [0..3], но никогда не выполнялись ,
Надеемся, что следующий стандарт распознает внутреннюю ошибку декорации атрибута и восстановит c89 как законный стандарт C.