Bedarf dieser transitive passiert, bevor Anwendungsfall eine sequentielle Konsistenz oder Erwerbsfreisetzung benötigt?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Bedarf dieser transitive passiert, bevor Anwendungsfall eine sequentielle Konsistenz oder Erwerbsfreisetzung benötigt?

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?>

Top