In base a cppreference , possiamo usare la semantica di rilascio-acquisizione per assicurare la precedenza di lettura-scrittura tra due discussioni come segue:
// Thread A
1. Write to X
2. Atomic store to Y with std::memory_order_release
// Thread B
3. Atomic load at Y with std::memory_order_acquire
4. Read at X
Supponendo che 2 sia ordinato prima di 3 (prendilo come dato che questo si verifica in base a Y), siamo certi che A di scrittura in X è visibile a B dal momento che può stabilire un ordine totale sugli eventi (come opportunamente descritto dalla mia enumerazione precedente) perché 1 sequenced-before 2 synchronizes-with 3 sequenced-before 4 e perché release-acquire assicura che tutte le scritture di A siano visibili a B dopo 3 .
Tuttavia , il link sopra indica esplicitamente che in questa situazione "tutte le scritture di memoria (atomiche non atomiche e rilassate) [da A diventano] effetti collaterali visibili nella discussione B." La mia domanda è quindi: sono "effetti collaterali visibili" considerate le scritture fatte B a thread precedentemente inconsapevoli delle scritture di A ?
In altre parole, supponiamo di avere un terzo thread C e un altro atomico:
// Thread A
1. Write to X
2. Atomic store to Y with std::memory_order_release
// Thread B
3. Atomic load at Y with std::memory_order_acquire
4. Read at X
5. Atomic store to Z with std::memory_order_release
// Thread C
6. Atomic load at Z with std::memory_order_acquire
7. Read at X
(supponiamo che 5 happens-before 6 ). C legge A scrive in X ? O è% "l'effetto collaterale visibile di B su X non considerato una scrittura?