Warum wird das flüchtige Schlüsselwort für die Thread-Synchronisierung nicht benötigt?

Ich lese, dass dievolatileas Schlüsselwort @ ist nicht für die Thread-Synchronisierung geeignet und wird für diese Zwecke überhaupt nicht benötigt.

Während ich verstehe, dass die Verwendung dieses Schlüsselworts nicht ausreicht, verstehe ich nicht, warum dies überhaupt nicht erforderlich ist.

Nehmen wir zum Beispiel an, wir haben zwei Threads: Thread A, der nur aus einer gemeinsam genutzten Variablen liest, und Thread B, der nur in eine gemeinsam genutzte Variable schreibt. Richtige Synchronisation durch z.B. pthreads mutexes wird erzwungen.

IIUC, ohne das flüchtige Schlüsselwort kann der Compiler den Code von Thread A lesen und sagen: "Die Variable scheint hier nicht geändert zu werden, aber wir haben viele Lesevorgänge. Lass es uns nur einmal lesen, den Wert zwischenspeichern und alle nachfolgenden Lesevorgänge optimieren. "Außerdem wird möglicherweise der Code von Thread B angezeigt und gesagt:" Wir haben hier viele Schreibvorgänge für diese Variable, aber keine Lesevorgänge. Die geschriebenen Werte werden also nicht benötigt, und wir müssen alle Schreibvorgänge optimieren. "

Beide Optimierungen wären falsch. Undbeid eine würde durch volatile verhindert. Also, ich würde wahrscheinlich zu dem Schluss kommen, dass währendvolatile reicht nicht aus, um Threads zu synchronisieren. Es ist weiterhin für alle Variablen erforderlich, die von Threads gemeinsam genutzt werden. (Anmerkung: Ich habe jetzt gelesen, dass es für @ eigentlich nicht erforderlich isvolatile um Schreibwahlen zu verhindern; Ich habe keine Ahnung, wie ich solche falschen Optimierungen verhindern kann.)

ch verstehe, dass ich hier falsch liege. Aber wieso

Antworten auf die Frage(8)

Ihre Antwort auf die Frage