Betrachten Sie den folgenden Code:
%Vor%Ich suche nach einem Zitat aus dem C ++ 11-Standard, der besagt, dass der Compiler die Schleife nicht in
transformieren darf %Vor%Ich habe einige Diskussionen hier gesehen, aber nichts Schlüssiges.
Bearbeiten : Eine frühere Version dieses Posts hat eine externe Funktion innerhalb der Schleife aufgerufen.
Edit 2 : Für Motivation: Das Buch "Effective Java" besagt, dass die HotSpot VM die folgende Umwandlung durchführt:
%Vor%bis
%Vor%obwohl das Verhalten für einen anderen Thread perfekt definiert ist, um die done Variable gleichzeitig zu ändern.
Vergessen Sie entspannt, es gibt keine Garantie, dass ein Atomspeicher überhaupt für eine atomare Ladung in einem anderen Thread sichtbar wird. Das Beste, was man bekommt, ist die normative Ermutigung in [atomics.order] / 12 (und analoger Formulierung) in [intro.progress] / 18 ):
Implementierungen sollten Atomspeicher für atomare Lasten sichtbar machen innerhalb einer angemessenen Zeit.
... was keine Voraussetzung ist.
(C11 hat identische Formulierung in §7.11.3 / 16)