powielać skierowana była tutaj, a to wymaga aktualizacji. „Nowy” język C11 umożliwia atrybut atomową, która przyznaje, że:
_Atomic int a;
...
a += 3
mogą być kompilowane do z (atomowego) nieograniczonej pętli. Dzięki za standardy prezentów, naprawdę żałuję, że tego nie zrobiłeś.
1: w niektórych architekturach operacje atomowe są możliwe tylko w pamięci obsługującej określone protokoły dostępu. ARMv7, MIPS na przykład włączyć sekwencję do:
do {
x = LoadLinked(a) + 3;
} while !StoreConditional(x, &a);
ale LoadLinked/StoreConditional jest niezdefiniowana dla niektórych typów pamięci/pamięci podręcznej. Ciesz się z debugowania tego.
2: Powiązane jest fałszywe udostępnianie które jest artefaktem LoadLinked, StoreConditional działającym na liniach pamięci podręcznej (np. 32, 64, 256 bajtów), a nie podblokach. A więc: _Atomic int a [4]; może wymagać 4 * rozmiaru linii pamięci podręcznej (czyli 1024 bajtów), aby bezpiecznie zezwalać na równoczesne operacje atomowe na [n] i [n + 1], ponieważ 4 jednostki centralne mogą być w stanie zaktualizować [0..3], ale nigdy kolejny.
Mam nadzieję, że następny standard rozpozna nieodłączne niepowodzenie dekoracji atrybutów i przywróci c89 jako prawowity standard C.
Które ARM? Architektura v6 (ARM10) i nowsze wersje mogą zapewniać operacje atomowe, jeśli kompilator je obsługuje lub uruchamiasz własny zespół. Wcześniejsze architektury nie. –
gcc ma wbudowane operacje atomowe: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Atomic-Builtins.html#Atomic-Builtins; uwaga: "Nie wszystkie operacje są obsługiwane przez wszystkie docelowe procesory" – Christoph
jest Windows API dla zablokowanego dostępu zmiennego: http://msdn.microsoft.com/en-us/library/ms684122%28v=VS.85%29.aspx –