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

Programme in C++. Entwicklerforum
Guest
 Bedarf dieser transitive passiert, bevor Anwendungsfall eine sequentielle Konsistenz oder Erwerbsfreisetzung benötigt?

Post by Guest »

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post