Nello standard C++ 11, la sezione 1.10/5 menziona, ma non definisce formalmente i termini acquire operation
, release operation
e consume operation
. Quindi procede nella Sezione 29 per usare questi termini per descrivere le azioni di determinati ordini di memoria, operazioni atomiche e recinzioni di memoria. Per esempio, 29,3/1 su "Ordine e Coerenza" afferma:Lo standard C++ 11 definisce formalmente le operazioni di acquisizione, rilascio e consumo?
memory_order_release, memory_order_acq_rel, e memory_order_seq_cst: un'operazione di memorizzazione esegue un'operazione rilascio [enfasi aggiunta] sulla memoria interessata Posizione.
Questo tipo di linguaggio è ripetuto in tutta la sezione 29, ma mi preoccupa un po 'che tutti i significati per i memory_order
enumerazioni si basano su tipi di operazione che si non sembrano essere formalizzata dalla norma, ma deve avere qualche significato comunemente concordato per essere efficaci come definizioni.
mettere un modo diverso, se ho detto "Un bar è un foo capovolto", il significato concreto di bar e foo sono ambigue in quanto nessuno dei due termini è definito formalmente. Solo le loro nature relative sono definite.
Lo standard C++ 11 o qualche altro documento del comitato di standard C++ 11 definisce formalmente cosa è esattamente uno acquire operation
, release operation
, o questi termini sono comunemente compresi? Se quest'ultimo, c'è un buon riferimento che è considerato uno standard di settore per il significato di queste operazioni? Mi chiedo in particolare perché i modelli di consistenza della memoria hardware non sono stati creati uguali, e quindi sto pensando che ci debba essere qualche riferimento comune che permetta a chi implementa compilatori, ecc. Di tradurre correttamente la semantica di queste operazioni in comandi di assemblaggio nativi.
Sono d'accordo con l'OP. Se lo standard è logicamente decifrabile è una domanda, ma in ogni caso lo standard è insolitamente confuso su questo particolare punto. – thb
[il post di Jeff Preshing sul rilascio/acquisizione] (http://preshing.com/20120913/acquire-and-release-semantics/) li definisce in termini di ordinamento richiesto rispetto a carichi/negozi precedenti/successivi, in un modo compatibile con la semantica C++ 11. Non mi ero reso conto che C++ 11 non li definiva formalmente in termini come questo. –