2013-03-09 21 views
7

Sto leggendo il modello C++ memoria definita in n3485 e si parla di rilascio/acquisire la semantica, che da quanto ho capito, e anche dalle definizioni given in this blog:rilascio/Acquire semantica WRT std :: mutex

Acquire semantica è una proprietà che può essere applicata solo alle operazioni che leggono dalla memoria condivisa, indipendentemente dal fatto che siano operazioni di lettura-modifica-scrittura o carichi semplici. L'operazione è quindi considerata una lettura acquisita. Acquisizione della semantica impedisce il riordino della memoria dell'acquisizione di lettura con qualsiasi operazione di lettura o scrittura che lo segue nell'ordine di programma.

semantica Stampa è una proprietà che può essere applicato solo alle operazioni che scrivere alla memoria condivisa, siano essi lettura-modifica-scrittura operazioni o negozi normali. L'operazione è quindi considerata una versione di scrittura. Release semantics impedisce il riordino della memoria del write-release con qualsiasi operazione di lettura o scrittura che lo preceda nell'ordine di programma.

sta per prevenire riordino di letture/scritture prima o dopo la lettura corrente/WRITE stato fatto. Il primo (acquisito) farà in modo che la lettura attualmente in corso non venga riordinata con nessuna lettura/scrittura che verrà dopo di essa, quest'ultima (release) si assicurerà che la scrittura corrente non venga riordinata con operazioni di lettura/scrittura che vengono prima esso.

Ora si può dire che std::mutex::lock avrà acquisire semantica e che std::mutex::unlock ha essenzialmente rilascio semantica?

Nel Principio posso trovare questo nella sezione

30.4.1.2 tipi Mutex [thread.mutex.requirements.mutex]

11 Sincronizzazione: prima unlock() operazioni sullo stesso oggetto deve sincronizzare con (1.10) questa operazione.

Da quello che ho capito sincronizzazione con non è esplicitamente definita nella norma, tuttavia sembra essere un tipo di accade prima relazione guardando due dichiarazioni in corso di valutazione tra due thread differenti, tuttavia, dalla mia comprensione della semantica acquisizione/rilascio, questo ha più a che fare con il riordino della memoria. La sincronizzazione con potrebbe anche essere chiamata rilascio/acquisizione della semantica?

Così la release/acquisizione di semantica si applica non solo al riordino delle operazioni di carico/immagazzinamento e anche all'interlacciamento delle operazioni intra-thread?

Nella sezione standard relativa al modello di memoria si parla principalmente di relazioni ordinate in termini di due thread intercalati. Ciò lascia aperta all'interpretazione se questo si applica anche all'ordinamento della memoria.

Qualcuno può chiarire?

+2

"Sincronizza con" è definito in [intro.multithread], 1.10, paragrafo 8. –

+0

@PeteBecker: Vero, ma ciò che è scritto non suona molto come una "definizione": "* Alcune chiamate di libreria si sincronizzano con altre chiamate di libreria eseguite da un altro thread: ad esempio, un archivio atomico si sincronizza con un load-acquis che prende il suo valore dallo store (29.3). * "Parole come" certain "e" ad esempio "non sono molto formali. –

+0

@AndyProwl - hai ragione, è un po 'sfocato. Non per "certo", che è un modo breve per dire "alcuni ma non tutti", ma perché non dice del tutto cosa significhi. Quando i requisiti della libreria dicono che un'operazione "si sincronizza con" un'altra operazione, questo introduce un ordinamento che diventa parte della relazione "inter-thread before before". Quindi non esiste un posto che definisce formalmente "sincronizza con". È una definizione distribuita: ovunque la specifica della libreria dice che succede è dove accade. –

risposta

6

Ora si può dire che std :: mutex :: lock acquisirà semantica e che std :: mutex :: unlock ha essenzialmente semantica di rilascio?

, corretto.

Da quello che ho capito sincronizzazione con non è esplicitamente definita nella norma

Beh, in teoria Paragrafo 1.10/8 è probabilmente lo scopo di dare la definizione di sincronizza con:

Alcune chiamate di libreria si sincronizzano con altre chiamate di libreria eseguite da un altro thread. Ad esempio, un rilascio dello store atomico si sincronizza con un carico-acquisizione che prende il suo valore dallo store (29.3). [Nota: ...]

D'altra parte, questa non sembra una definizione molto formale. Tuttavia, una migliore, anche se implicito è indirettamente di cui al paragrafo 1.10/10:

Una valutazione A è dipendenza-ordinati prima una valutazione B se

- Un esegue un'operazione di rilascio su un atomica oggetto M, e, in un altro thread, B esegue un'operazione di consumo su M e legge un valore scritto da qualsiasi effetto collaterale nella sequenza di rilascio intestata da A, o

- per qualche valutazione X, A è dipendente dalla dipendenza prima che X e X portino una dipendenza a B.

[Nota: La relazione "è ordinata prima della dipendenza" è analoga a "sincronizza con", ma utilizza la versione/- consumare al posto di release/acquisisci. -end nota]

Dal momento che il "è analoga a" relazione è più spesso simmetrica, direi che la precedente definizione di "è-dipendenza-ordinato prima" indirettamente fornisce una definizione di " si sincronizza con "anche se si potrebbe obiettare correttamente che le note non sono normative; ancora, questa sembra essere la definizione desiderata.

mia intuizione della sincronizza con rapporto è che si verifica tra una scrittura operazione (atomico) eseguita da un thread che memorizza un certo valore e la prima operazione che legge tale valore (atomico). Quell'operazione potrebbe anche essere nella stessa discussione.

Se le due operazioni sono su fili diversi, la sincronizzazione con la relazione stabilisce un ordine cross-thread sulle operazioni.

Nel Principio posso trovare questo nella sezione

30.4.1.2 tipi Mutex [thread.mutex.requirements.mutex]

11 Sincronizzazione: prima unlock() operazioni sullo stesso oggetto deve sincronizzare con (1.10) questa operazione.

Per me, questo sembra compatibile con l'interpretazione sopra riportata. Un'operazione con semantica di rilascio (sblocco, memorizzazione) si sincronizzerà con un'operazione di acquisizione della semantica (blocco, caricamento).

tuttavia, dalla mia comprensione della semantica acquisizione/rilascio, questo ha più a che fare con il riordino della memoria. sincronizzare con potrebbe anche essere chiamato rilascio/acquisizione della semantica?

Rilasciare e acquisire la semantica descrive la natura di alcune operazioni; la sincronizzazione con la relazione è (effettivamente) una relazione stabilita tra le operazioni che hanno acquisito o rilasciato la semantica, in un modo ben definito.

Quindi, in un certo senso, sincronizza-con è una conseguenza della semantica di tali operazioni, e usiamo quelle semantica per ottenere il corretto ordine delle istruzioni e costrizione il possibile riordino che la CPU o il compilatore si esibiranno.

+1

Quindi un mutex agisce come un recinto, ma l'unica differenza è che con una fence, più thread possono ancora eseguire il codice simultaneamente, mentre un mutex rende il codice reciprocamente esclusivo, giusto? –

+2

@TonyTheLion: Sto ancora imparando questa roba (più o meno come te credo) e ho scritto questa risposta senza molta conoscenza formale, per cercare di completare la tua comprensione parziale con la mia comprensione parziale. Tuttavia, al momento non penso di avere una comprensione abbastanza buona da rispondere a quest'ultima domanda –

Problemi correlati