Apparentemente, dopo alcune ricerche in giro, una "operazione di consumo" è un'operazione di memoria in cui un valore letto dalla memoria viene utilizzato dopo il carico in diverse operazioni e crea una dipendenza dei dati.
Essere in grado di ordinare operazioni senza introdurre esplicite memorie di memoria, è l'obiettivo apparente (dalla mia comprensione) di memory_order_consume
.
Con memory_order_consume
, il compilatore e CPU sono tenuti ordinare il carico in questione nei confronti solo quei carichi e esercizi successivi cui indirizzo o valori sono calcolati dal valore caricato. source
avanti in questo testo che dice:
/*Example code elided */
Il punto chiave è che il atomic_load_explicit()
usando memory_order_consume
garantisce che gli accessi successivi vedranno qualsiasi inizializzazione effettuata da insert_foo()
, anche se sono eseguendo contemporaneamente, e senza il sovraccarico di istruzioni esplicite di memory-fence. In constrast, memory_order_acquire
richiederebbe esplicite barriere di memoria su sistemi debolmente ordinati e vincolerebbe eccessivamente le ottimizzazioni del compilatore su tutti i sistemi.
C++ 11 Pescaggio n3485 definisce memory_order_consume
come:
29,3 ordine e coerenza [atomics.order]
memory_order_consume: un'operazione di caricamento esegue un'operazione di consumare i colpiti posizione di memoria.
Quindi dalla mia comprensione è quello di ordinare i carichi di memoria in modo che i carichi e negozi che utilizzano tale carico successivi sono infatti successiva. In altre parole, il carico è consumato.
fonte
2013-03-07 12:26:20
Penso che sia spiegato bene in "C++ Concurrency in Action" di Anthony Williams (ma ho dimenticato). –
@KerrekSB Penso che potrebbe essere il momento per me di acquisire quel libro. –
@TonyTheLion: Sì, quel libro lo spiega abbastanza bene –