2013-03-07 7 views
15

Ho visto che esiste this question on acquire, release, consume, etc, tuttavia, nessuna risposta definisce realmente cosa sia effettivamente una "operazione di consumo".Che cosa è un'operazione di consumo nello standard C++ 11?

In 1,10 paragrafo 5 afferma:

Un'operazione di sincronizzazione in una o più posizioni di memoria è o un consumano operazione, operazione acquisiscono, un'operazione di rilascio, o entrambi un'acquisizione e rilasciare il funzionamento.

Mi chiedevo se qualcuno può spiegare che cosa è come viene utilizzato nella sezione 1.10 dello standard C++ 11?

+1

Penso che sia spiegato bene in "C++ Concurrency in Action" di Anthony Williams (ma ho dimenticato). –

+1

@KerrekSB Penso che potrebbe essere il momento per me di acquisire quel libro. –

+0

@TonyTheLion: Sì, quel libro lo spiega abbastanza bene –

risposta

9

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.