In C ++, la memoria semantica di acquisizione-rilascio è transitoria?

2

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?

    
posta VF1 16.08.2014 - 21:32
fonte

1 risposta

4

Formalmente, stai chiedendo se l'effetto collaterale su X nel thread A è visibile rispetto al calcolo del valore di X nel thread C.

Affinché ciò sia vero, è necessario che avvenga prima del 7.

A accade-prima che B sia definito, come avviene la sincronizzazione con o inter-thread-before, e quest'ultima è definita come

for some evaluation X,

— A synchronizes with X and X is sequenced before B, or

— A is sequenced before X and X inter-thread happens before B, or

— A inter-thread happens before X and X inter-thread happens before B.

Quindi sì, è perfettamente transitabile su più thread. In particolare, nel tuo caso,

1 sequenced-before 2

2 sincronizza-con 3

3 sequenced-before 5

5 sincronizza-con 6

6 sequenced-before 7

Quindi, 1 accade-prima di 7, quindi 1 è un effetto collaterale visibile rispetto a 7, e quindi il valore dell'oggetto scalare non atomico X come determinato dal calcolo del valore di X (il tuo "Leggi in X") ) è garantito essere il valore memorizzato dall'effetto collaterale visibile 1.

    
risposta data 17.08.2014 - 04:01
fonte

Leggi altre domande sui tag