Du hast falsch gehört. Es kann durchaus sein, dass dies "i++"für einen bestimmten Compiler und eine bestimmte Prozessorarchitektur threadsicher ist, aber in den Standards überhaupt nicht vorgeschrieben ist. Da Multithreading nicht Teil der ISO C- oder C ++ - Standards (a) ist , können Sie nichts als threadsicher betrachten, basierend auf dem, was Ihrer Meinung nach kompiliert wird.
Es ist durchaus machbar, dass ++ieine beliebige Reihenfolge wie folgt kompiliert werden kann:
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
Das wäre auf meiner (imaginären) CPU, die keine Anweisungen zum Inkrementieren des Speichers enthält, nicht threadsicher. Oder es kann klug sein und es kompilieren in:
lock ; disable task switching (interrupts)
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
unlock ; enable task switching (interrupts)
wo lockdeaktiviert und unlockaktiviert Interrupts. Aber selbst dann ist dies in einer Architektur mit mehr als einer dieser CPUs, die sich den Speicher teilen, möglicherweise nicht threadsicher ( lockmöglicherweise werden nur Interrupts für eine CPU deaktiviert).
Die Sprache selbst (oder Bibliotheken dafür, wenn sie nicht in die Sprache integriert ist) bietet threadsichere Konstrukte, und Sie sollten diese verwenden, anstatt von Ihrem Verständnis (oder möglicherweise Missverständnissen) davon abzuhängen, welcher Maschinencode generiert wird.
Dinge wie Java synchronizedund pthread_mutex_lock()(für C / C ++ unter einigen Betriebssystemen verfügbar) sind das, worauf Sie achten müssen (a) .
(a) Diese Frage wurde gestellt, bevor die Standards C11 und C ++ 11 abgeschlossen wurden. Diese Iterationen haben jetzt Threading-Unterstützung in die Sprachspezifikationen eingeführt, einschließlich atomarer Datentypen (obwohl sie und Threads im Allgemeinen zumindest in C optional sind ).