Ist diese Compiler-Umwandlung erlaubt?

8

Betrachten Sie diesen Code, wobei x und y ganze Zahlen sind:

%Vor%

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?

    
LWimsey 25.08.2017, 15:42
quelle

1 Antwort

6

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.

    
Baum mit Augen 25.08.2017, 16:17
quelle

Tags und Links