Code: Select all
#include
#include
#include
uint64_t timestamp() {
auto now = std::chrono::steady_clock::now().time_since_epoch();
return std::chrono::duration_cast(now).count();
}
int main() {
std::atomic val;
long int now1, now2;
auto t1 = std::thread([&]() {
val.store(1); // #1
now1 = timestamp(); // #2
});
auto t2 = std::thread([&]() {
now2 = timestamp(); // #3
val.load(); // #4
});
t1.join();
t2.join();
}
Wenn zwei beliebige Auswertungen A und B gegeben sind und 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.
In t1 soll die Ausführung von #1 der Ausführung vorausgehen von #2. Ebenso muss in t2 die Ausführung von #3 der Ausführung von #4 vorausgehen.
time.clock.req sagt:
eine Funktion now(), um den aktuellen time_point zu erhalten.
- Gibt ein time_point-Objekt zurück, das den aktuellen Zeitpunkt darstellt.
Da die Sequenz-vorher #1 irgendwann vor dem durch now1 bezeichneten Zeitpunkt ausgeführt wird und #4 irgendwann nach dem durch now2 bezeichneten Zeitpunkt ausgeführt wird. Wenn now1 < now2, können wir daraus schließen?
Code: Select all
#1Beachten Sie, dass das hier verwendete „before“ nicht etwas über die Sichtbarkeit oder die durch den C++-Standard definierte Reihenfolge bedeutet. Es wird lediglich die Beziehung zwischen dem Zeitpunkt der Ausführung dieser beiden Operationen besprochen.
Also zwei Fragen aus der Perspektive der abstrakten Maschine:
- Bezeichnet der von now() zurückgegebene Wert einen globalen Zeitpunkt des gesamten Programms, auch wenn mehrere Threads beteiligt sind?
- Wenn die erste Frage „Ja“ lautet, lässt sich daraus dann schließen, dass #1 irgendwann zuvor ausgeführt wurde? der Zeitpunkt, an dem #4 ausgeführt wird?
Mobile version