Jeśli chcesz uzyskać atomowy przyrost w C ++, możesz użyć bibliotek C ++ 0x ( std::atomic
typ danych) lub czegoś takiego jak TBB.
Kiedyś wytyczne GNU dotyczące kodowania mówiły, że aktualizacja typów danych, które pasują do jednego słowa, jest „zwykle bezpieczna”, ale ta rada jest błędna dla maszyn SMP, błędna dla niektórych architektur i błędna, gdy używa się optymalizującego kompilatora.
Aby wyjaśnić komentarz dotyczący „aktualizowania jednowyrazowego typu danych”:
Możliwe jest, że dwa procesory na maszynie SMP zapisują w tej samej lokalizacji pamięci w tym samym cyklu, a następnie próbują propagować zmianę na inne procesory i pamięć podręczną. Nawet jeśli zapisywane jest tylko jedno słowo danych, więc zapisy trwają tylko jeden cykl, są one również wykonywane jednocześnie, więc nie można zagwarantować, który zapis się powiedzie. Nie otrzymasz częściowo zaktualizowanych danych, ale jeden zapis zniknie, ponieważ nie ma innego sposobu na rozwiązanie tego przypadku.
Porównaj i zamień poprawnie współrzędne między wieloma procesorami, ale nie ma powodu, aby sądzić, że każda zmienna przypisana jednowyrazowym typom danych będzie używać funkcji porównania i zamiany.
I chociaż optymalizujący kompilator nie wpływa na sposób kompilacji ładowania / przechowywania, może się zmienić, gdy nastąpi ładowanie / przechowywanie, powodując poważne problemy, jeśli spodziewasz się, że odczyty i zapisy będą się odbywać w tej samej kolejności, w jakiej pojawiają się w kodzie źródłowym ( najsłynniejsze jest podwójnie sprawdzane blokowanie nie działa w waniliowym C ++).
UWAGA Moja oryginalna odpowiedź również mówiła, że 64-bitowa architektura Intela była zepsuta podczas radzenia sobie z 64-bitowymi danymi. To nieprawda, więc zredagowałem odpowiedź, ale moja edycja twierdziła, że chipy PowerPC są zepsute. Jest to prawdą podczas wczytywania wartości bezpośrednich (tj. Stałych) do rejestrów (zobacz dwie sekcje o nazwie „Wskaźniki ładowania” pod listą 2 i listą 4). Ale jest instrukcja ładowania danych z pamięci w jednym cyklu ( lmw
), więc usunąłem tę część mojej odpowiedzi.