by Guest » 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>
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 );
}
Aber würde dies nicht auch die Behauptung abgeben, wenn die Freigabe/Erwerb stattdessen wie folgt verwendet wurde?
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
}
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?>
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>
[code]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]
Aber würde dies nicht auch die Behauptung abgeben, wenn die Freigabe/Erwerb stattdessen wie folgt verwendet wurde?
[code]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
}
[/code]
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?>