Un duplicar fue dirigido aquí, y esto necesita una actualización. El “nuevo” lenguaje C11 permite un atributo atómica que admite que:
_Atomic int a;
...
a += 3
pueden ser compilados en un bucle sin límites (atómica). Gracias por la gente de estándares de regalos, realmente desearía que no lo hubieras hecho.
1: en algunas arquitecturas, las operaciones atómicas solo son posibles en la memoria que admite ciertos protocolos de acceso. ARMv7, MIPS, por ejemplo, encender la secuencia en:
do {
x = LoadLinked(a) + 3;
} while !StoreConditional(x, &a);
pero LoadLinked/StoreConditional no está definido para algunos tipos de memoria/caché. Disfruta de depurar eso.
2: relacionado es falsa compartir que es un artefacto de LoadLinked, StoreConditional operando sobre líneas de caché no sub-bloques (por ejemplo, 32, 64, 256 bytes.). Entonces: _Atomic int a [4]; podría requerir 4 * tamaño de línea de caché (por lo tanto 1024 bytes) para permitir operaciones atómicas simultáneas en un [n] y un [n + 1], porque 4 CPU podrían estar luchando para actualizar un [0..3], pero nunca subsiguiente.
Esperemos que la próxima norma reconozca la falla inherente de la decoración de atributos, y restituya c89 como el estándar de C correcto.
¿Qué ARM? La arquitectura v6 (ARM10) y más adelante puede proporcionar operaciones atómicas, si el compilador lo admite o usted desenrolla su propio ensamblaje. Las arquitecturas anteriores no pueden. –
gcc tiene operaciones atómicas integradas: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Atomic-Builtins.html#Atomic-Builtins; tenga en cuenta: "No todas las operaciones son compatibles con todos los procesadores de destino" – Christoph
hay una API de Windows para el acceso variable interconectado: http://msdn.microsoft.com/en-us/library/ms684122%28v=VS.85%29.aspx –