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?