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?
"Sincronizza con" è definito in [intro.multithread], 1.10, paragrafo 8. –
@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. –
@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. –