[intro.execution] p8 sagt:
Wenn bei zwei beliebigen Auswertungen A und B A vor B sequenziert wird (oder äquivalent B nach A sequenziert wird),
dann soll die Ausführung von A der Ausführung von B vorausgehen.
Betrachten Sie dieses Beispiel:
Code: Select all
#include
#include
int main(){
std::atomic v1;
std::atomic v2;
auto t1 = std::thread([&](){
v1.store(1,std::memory_order:relaxed); // #1
v2.store(2,std::memory_order:relaxed); // #2
});
t1.join();
}
Eine echte Implementierung kann eine StoreStore-Neuordnung durchführen, auch zur Kompilierungszeit, sodass #2 von t1 ausgeführt wird, #1 jedoch nicht. Verstößt diese Neuordnung gegen [intro.execution] p8? Gemäß [intro.execution] p8 können wir
im abstrakten Maschinensinn, wenn #2 von t1 ausgeführt wird, daraus schließen, dass #1 bereits von Thread t1 ausgeführt wurde, da
die Ausführung von #1 der Ausführung von #2 vorausgehen soll; Die StoreStore-Neuordnung macht die Aussage jedoch falsch.
Wie ist der Widerspruch hier zu interpretieren?