Bedarf dieser transitive passiert, bevor Anwendungsfall eine sequentielle Konsistenz oder Erwerbsfreisetzung benötigt?
Posted: 08 Feb 2025, 16:06
Dieser Snip stammt aus Herb Sutters Atomwaffen -Talk -Folie von Seite Nummer 19.
< /p>
Wenn ich dies richtig verstehe, muss Herb sagen, dass dies für die Behauptung in Thread 3, um nicht Feuer zu feiern, der sequentiellen Konsistenz folgen muss. Der folgende Code feuert also die Assert nicht ab. < /P>
Aber würde dies nicht auch die Behauptung abgeben, wenn die Freigabe/Erwerb stattdessen wie folgt verwendet wurde?
q1-nicht // a einfach-happens-before // b sicherstellen Da kein anderer Thread in g ?
q2 geschrieben - verstehe ich den Anschluss an die Folie falsch oder etwas stimmt auf der Folie nicht?>
< /p>
Wenn ich dies richtig verstehe, muss Herb sagen, dass dies für die Behauptung in Thread 3, um nicht Feuer zu feiern, der sequentiellen Konsistenz folgen muss. Der folgende Code feuert also die Assert nicht ab. < /P>
Code: Select all
int g{0}; // normal int
std::atomic x{0}, y{0}; // atomics
void thread1() {
g = 1;
x.store(1, std::memory_order_seq_cst);
}
void thread2() {
if(x.load(std::memory_order_seq_cst) == 1)
y.store(1, std::memory_order_seq_cst);
}
void thread3() {
if(y.load(std::memory_order_seq_cst) == 1)
assert( g == 1 );
}
Code: Select all
int g{0}; // normal int
std::atomic x{0}, y{0}; // atomics
void thread1() {
g = 1; // A
x.store(1, std::memory_order_release);
}
void thread2() {
if(x.load(std::memory_order_acquire) == 1)
y.store(1, std::memory_order_release);
}
void thread3() {
if(y.load(std::memory_order_acquire) == 1)
assert( g == 1 ); // B
}
q2 geschrieben - verstehe ich den Anschluss an die Folie falsch oder etwas stimmt auf der Folie nicht?>