Un duplicare è stato diretto qui, e questo ha bisogno di un aggiornamento. Il “nuovo” linguaggio C11 consente un attributo atomica che ammette che:
_Atomic int a;
...
a += 3
può essere compilato in un (atomico) ciclo illimitata. Grazie per la gente di standard di regalo, davvero vorrei che tu non avessi.
1: in alcune architetture, le operazioni atomiche sono possibili solo su memoria che supporta determinati protocolli di accesso. ARMv7, MIPS per esempio girare la sequenza in:
do {
x = LoadLinked(a) + 3;
} while !StoreConditional(x, &a);
ma LoadLinked/StoreConditional è definito per alcuni tipi di memoria/cache. Godetevi il debug di questo.
2: correlati è falso condivisione che è un artefatto di LoadLinked, StoreConditional operando sullo linee di cache non sottoblocchi (ad esempio 32, 64, 256 byte.). Quindi: _Atomic int a [4]; potrebbe richiedere 4 * dimensioni della linea cache (quindi 1024 byte) per consentire operazioni atomiche simultanee su un [n] e un [n + 1], perché 4 cpu potrebbero essere preoccupanti per aggiornare un [0..3], ma mai riuscendo.
Speriamo che lo standard successivo riconosca l'errore intrinseco della decorazione degli attributi e ripristini c89 come standard C corretto.
Quale ARM? Architecture v6 (ARM10) e versioni successive possono fornire operazioni atomiche, se il compilatore lo supporta o se si rotola il proprio assembly. Le architetture precedenti non possono. –
gcc ha incorporato operazioni atomiche: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Atomic-Builtins.html#Atomic-Builtins; si prega di notare: "Non tutte le operazioni sono supportate da tutti i processori di destinazione" – Christoph
c'è l'API di Windows per l'accesso variabile interbloccato: http://msdn.microsoft.com/en-us/library/ms684122%28v=VS.85%29.aspx –