Im Falle eines einzelnen Schreibers und vieler Leser dieses einzelnen Wertes ist es thread-safe , aber im allgemeinen Fall sind solche Operationen nicht thread-sicher (daher ist eine Sperre oder die Verwendung von atomaren Operationen erforderlich). Außerdem, was thread-safe Mittel sind hier sehr begrenzt.
Wenn Sie einfach tun i++
in einem Thread, werden die anderen Threads entweder den alten oder den neuen Wert sehen. Auf den beiden von Ihnen genannten Plattformen werden die Werte atomar gespeichert/geladen, so dass sie keinen halben Wert erhalten können. Dies trifft jedoch nicht generell zu, da z. B. ein 64-Bit-Wert auf x86 nicht atomar gespeichert wird, so dass der Leser die Hälfte des alten Wertes und die Hälfte des neuen Wertes erhalten könnte. Also Gewindesicherheit ist hier sehr plattformspezifisch.
Man muss aber trotzdem vorsichtig sein. Wenn es sich um eine einfache int
kann der Optimierer den Ladevorgang einfach verwerfen (vielleicht eine Kopie in einem Register behalten). In diesem Fall wird der Leser nie einen neuen Wert erhalten. Dies ist von entscheidender Bedeutung, wenn Sie dies in einer Schleife tun. Leider ist der einzige standardkonforme Weg, dies zu tun, in C++0x die Verwendung einer atomic<T>
Typ ( flüchtig erfüllt diesen Zweck jetzt bei einigen Compilern).
Wenn Sie einen zweiten Writer hinzufügen, ist der Inkrement-Operator natürlich überhaupt nicht thread-sicher. Sie könnten hier jedoch eine atomare Hinzufügungsfunktion verwenden, die das Ganze wieder thread-sicher machen würde.