Betrachten Sie diesen Code, wobei x
und y
ganze Zahlen sind:
Ist die folgende Compiler-Umwandlung zulässig?
%Vor%Kontext :
Dies ist aus Bjarne Stroustrups FAQ:
%Vor% Die FAQ besagt, dass dies Datenrennen frei ist; mit x
und y
beide 0, keiner der vars sollte geschrieben werden.
Aber was, wenn die Transformation erlaubt ist?
Anders als ich in meinem falschen Kommentar geschrieben habe, ist diese Umwandlung eigentlich nicht erlaubt, wenn y
möglicherweise zwischen Threads geteilt wird und der Compiler kein vorhandenes UB im ursprünglichen Code nachweisen kann.
Der Standard sagt ausdrücklich:
Compiler-Transformationen, die Zuweisungen zu einem möglicherweise gemeinsam genutzten Speicherort einführen würde nicht durch die abstrakte Maschine modifiziert werden, sind in der Regel von dieser Norm ausgeschlossen, da eine solche Die Zuweisung kann in Fällen, in denen eine abstrakte Maschine vorhanden ist, eine andere Zuweisung durch einen anderen Thread überschreiben Ausführung hätte kein Datenrennen stattgefunden.
[intro.multithread] (1.10 / 22) in N3337, (1.10 / 25) in N4141.
Wenn also x
immer 0 ist, wäre der ursprüngliche Code rennfrei, während der umgewandelte nicht. Daher ist die Transformation nicht legal.