2012-05-10 2 views
21

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.

+1

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

+0

[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. –

risposta

6

C'è una definizione informale riassunte proposta in una delle note:

eseguire un'operazione di rilascio su A forze effetti collaterali precedenti su altre locazioni di memoria per diventare visibile ad altri fili che successivamente quali svolge una consumano o un'acquisizione operazione su A.

Oltre a ciò, il comportamento delle operazioni acquisire e rilascio è completamente definito in 1.10, specificatamente come contribuiscono a accade-prima rapporti. Qualsiasi definizione a parte il comportamento è inutile.

+0

Immagino siano i "sommari informali" che mi danno fastidio. Ad esempio, se si tenta di associare un'operazione di rilascio a istruzioni hardware per una determinata piattaforma, è necessario conoscere semanticamente ciò che è e non è consentito, poiché l'hardware potrebbe non fornire alcune specifiche operazioni di "rilascio". Dal momento che non esiste una corrispondenza uno-a-uno, un significato più formale può aiutare con traduzioni accurate. Detto questo, rileggerò la sezione 1.10 e vedrò se non riesco a capire meglio il ponte tra il comportamento che stai descrivendo e l'uso effettivo dei termini operativi. – Jason

+1

@Jason: lo standard si concentra sul comportamento. Non cerca di definire termini isolati. –

+0

@Jason, Va notato che anche nei documenti tecnici Intel le garanzie dell'ordine di memoria sono descritte anche come garanzie di ordinamento comportamentale. Cioè, l'ordine di memoria è un comportamento controllato da una serie di istruzioni. Il modo in cui vengono raggiunti gli ordini garantiti da C++ potrebbe essere diverso da compilatore a compilatore per la stessa piattaforma, e sicuramente sarà per hardware diverso. –

3

Non vedo alcuna definizione formale di acquisizione/rilascio semantica dopo una rapida occhiata allo standard, quindi la mia ipotesi è che si presumano termini comunemente compresi.

Non riescono a definire tutto, dopotutto.

Non è un riferimento definitivo, ma Raymond Chen has blogged about acquire/release semantics. Il suo post include a link to Microsoft's definition of acquire and release semantics, che potrebbe anche essere utile.

+0

Dovresti considerare anche i documenti ISO di base, ad es. C e Unicode (10646). – MSalters

0

Prendo anche l'acquisizione/rilascio di semantica per essere abbastanza definitiva sul proprio; anche se storicamente sono termini più specifici dell'hardware piuttosto che termini di programmazione.

Tuttavia, penso che la sezione 1.10 per i paragrafi 5 e 6 sembra corrispondere a tutte le definizioni di semantica di acquisizione/rilascio che ho letto in altri standard di lingua nonché alle definizioni della CPU.

Indipendentemente da ciò, uno dei punti principali di C++ 11 era definire un modello di memoria moderno per supportare codice concomitante e multi-thread. Trovo difficile credere che non abbiano capito bene :)

3

in realtà queste operazioni sono definite nella sezione 1.10/5-12.

release/acquire coppia corrisponde a succedere prima della relazione; mentre la coppia release/consume alla dipendenza - ordinata prima della relazione.