I valori std::memory_order
consentono di specificare i vincoli a grana fine sull'ordine di memoria fornito dalle operazioni atomiche. Se si stanno modificando e accedendo a variabili atomiche da più thread, passare i valori std::memory_order
alle operazioni consente di rilassare i vincoli sul compilatore e sul processore sull'ordine in cui le operazioni su tali variabili atomiche diventano visibili ad altri thread, e gli effetti di sincronizzazione hanno quelle operazioni sui dati non atomici nella tua applicazione.
L'ordinamento di default del std::memory_order_seq_cst
è più vincolato, e fornisce le proprietà "intuitivi" ci si potrebbe aspettare: se infilare un memorizza alcuni dati e quindi imposta una bandiera atomica usando std::memory_order_seq_cst
, quindi se thread B vede il flag è impostato allora può vedere i dati scritti dal thread A. Gli altri valori di ordine della memoria non forniscono necessariamente questa garanzia e devono quindi essere usati con molta attenzione.
La premessa fondamentale è: non utilizzare qualcosa di diverso std::memory_order_seq_cst
(impostazione predefinita) a meno che (a) si ha realmente davvero sapere cosa si sta facendo, e può dimostrare che l'utilizzo rilassato è sicuro in tutti i casi, e (b) il tuo profiler dimostra che la struttura dei dati e le operazioni con cui intendi utilizzare gli ordini rilassati sono un collo di bottiglia.
mio libro, C++ Concurrency in Action dedica un intero capitolo (45 pagine) per i dettagli del modello di memoria C++, operazioni atomiche ei std::memory_order
vincoli, e un ulteriore capitolo (44 pagine) utilizzando operazioni atomiche per la sincronizzazione in blocco privo strutture di dati e le conseguenze dei vincoli di ordine rilassato.
I miei post sul blog Dekker's algorithm e Peterson's algorithm per l'esclusione reciproca illustrano alcuni dei problemi.
fonte
2012-03-05 10:11:52
+1 molto buona domanda. speriamo in alcune buone risposte! –
Ho trovato questo (piuttosto denso) [risposta] (http://stackoverflow.com/a/7463092/726300) utile in passato come introduzione all'ordinazione della memoria. –
Sembra che questo argomento possa andare piuttosto in profondità. Come ha suggerito zvrba, come un principiante come me, usare il valore predefinito "ordinamento sequenziale-consistente" potrebbe essere una buona idea. – 2607