Ich habe eine Variable int foo
, auf die von zwei Threads zugegriffen wird. Angenommen, ich habe keine Race-Condition-Probleme (der Zugriff ist durch einen Mutex geschützt, alle Operationen sind atomar oder was auch immer für andere Methoden zum Schutz vor Race Conditions), gibt es immer noch das Problem des "Register Caching" (mangels eines besseren Namens) , wobei der Compiler annehmen kann, dass, wenn die Variable zweimal gelesen wird, ohne dazwischen geschrieben zu werden, sie denselben Wert hat und Dinge wie: "optimieren" kann:
oder
%Vor% markiert% ce_de% als foo
dieses Problem? Werden Änderungen von einem Thread garantiert den anderen Thread erreichen?
Wenn nicht, was gibt es sonst noch dafür? Ich brauche eine Lösung für Linux / Windows (möglicherweise separate Lösungen), keine C ++ 11.
Was Sie brauchen, sind Speicherbarrieren.
%Vor%oder
%Vor%Bearbeiten: Ich habe den interessanten Teil hervorgehoben und hier ist der Link zum Wiki-Artikel ( Ссылка ) ) und die zugehörige Referenz ( Ссылка )
Hier ist die Antwort auf Ihre andere Frage (aus Wikipedia): In C und C ++ sollte das Schlüsselwort "volatile" C- und C ++ - Programmen direkten Zugriff auf Memory-Mapped I / O ermöglichen. Speicherbelegte E / A erfordert im Allgemeinen, dass die Lese- und Schreibvorgänge, die im Quellcode angegeben sind, in der angegebenen Reihenfolge ohne Auslassungen erfolgen. Auslassungen oder Neuordnungen von Lese- und Schreibvorgängen durch den Compiler würden die Kommunikation zwischen dem Programm und dem Gerät, auf das durch speicherprogrammierte E / A zugegriffen wird, unterbrechen. Ein C- oder C ++ - Compiler kann Lese- und Schreibvorgänge nicht in flüchtige Speicherbereiche umordnen, noch kann ein Lesen oder Schreiben in einen flüchtigen Speicherbereich entfallen. Das Schlüsselwort volatile garantiert keine Speicherbarriere zum Erzwingen der Cache-Konsistenz. Daher reicht die Verwendung von "volatile" allein nicht aus, um eine Variable für die Kommunikation zwischen Threads auf allen Systemen und Prozessoren zu verwenden [1]
Überprüfen Sie diese, es bietet großartige Erklärungen zu dem Thema: Ссылка Ссылка
Wenn der Zugriff durch einen Mutex geschützt ist, müssen Sie sich keine Sorgen machen. Das volatile
Schlüsselwort ist hier nutzlos. Ein Mutex ist eine vollständige Speicherschranke und daher kann kein Objekt, dessen Adresse von außen sichtbar ist, über die Mutex-Sperre zwischengespeichert oder entsperrt werden.
Das Schlüsselwort volatile
wurde ursprünglich eingeführt, um anzuzeigen, dass der Wert von der Hardware geändert werden kann. Dies geschieht, wenn das Hardware-Gerät über Speicherkarten oder Speicherpuffer verfügt. Der richtige Ansatz ist, es nur für diesen Zweck zu verwenden.
Alle modernen Synchronisationssprachenkonstrukte und Synchronisationsbibliotheken verwenden dieses Schlüsselwort nicht. Programmierer auf Anwendungsebene sollten das Gleiche tun.
Tags und Links c c++ multithreading volatile