Frage Definiert der C ++ 11-Standard formal Operationen zum Akquirieren, Freigeben und Konsumieren?


Im C ++ 11-Standard erwähnt Abschnitt 1.10 / 5 die Begriffe, formu- liert sie aber nicht formell acquire operation, release operation, und consume operation. Es geht dann in Abschnitt 29 weiter, um diese Ausdrücke zu verwenden, um die Aktionen bestimmter Speicherordnungen, atomarer Operationen und Speicherzäune zu beschreiben. Zum Beispiel heißt es in 29.3 / 1 zu "Order and Consistency":

memory_order_release, memory_order_acq_rel, und memory_order_seq_cst: Eine Speicheroperation führt ein Freigabevorgang [Hervorhebung hinzugefügt] auf dem betroffenen Speicherort.

Diese Art von Sprache wird in Abschnitt 29 wiederholt, aber es stört mich ein bisschen, dass alle Bedeutungen für die memory_order Aufzählungen basieren auf Operationstypen, die selbst nicht durch den Standard formalisiert zu sein scheinen, müssen jedoch einige gemeinsam akzeptierte Bedeutung haben, damit sie als Definitionen wirksam sind.

Anders ausgedrückt, wenn ich sagte "Eine Bar ist ein umgedrehtes Foo", die konkrete Bedeutung von Bar und foo sind mehrdeutig, da keiner der Begriffe formal definiert ist. Nur ihre relativen Naturen sind definiert.

Definiert der C ++ 11-Standard oder ein anderes C ++ 11-Standard-Komitee-Dokument formal genau was acquire operation, release operationusw., oder sind das einfach allgemein verstandene Begriffe? Wenn Letzteres, gibt es eine gute Referenz, die als Industriestandard für die Bedeutung dieser Operationen gilt? Ich frage speziell, weil Hardware-Speicherkonsistenzmodelle nicht gleich sind, und daher stelle ich fest, dass es eine allgemein akzeptierte Referenz geben muss, die es Compilern usw. ermöglicht, die Semantik dieser Operationen in native Assemblerbefehle zu übersetzen.


21
2018-05-10 01:33


Ursprung


Antworten:


Es gibt eine informelle zusammenfassende Definition in einem der Notizen:

Durchführen einer Freigabeoperation an A Erzwingt, dass frühere Nebenwirkungen auf andere Speicherorte für andere Threads sichtbar werden, auf denen später eine Consumer- oder eine Acquire-Operation ausgeführt wird A.

Darüber hinaus ist das Verhalten von Acquire- und Release-Operationen in 1.10 vollständig definiert, insbesondere in Bezug auf deren Beitrag passiert-vorher Beziehungen. Jede Definition außer dem Verhalten ist nutzlos.


6
2018-05-10 02:52



Ich sehe keine formale Definition von Semantik zum Erwerb / Freigeben nach einem kurzen Blick durch den Standard, so dass ich vermute, dass es sich um allgemein verstandene Begriffe handelt.

Sie können schließlich nicht alles definieren.

Es ist keine definitive Referenz, aber Raymond Chen hat über Semantik zum Thema "Akquirieren / Freigeben" gebloggt. Sein Beitrag beinhaltet ein Link zu Microsofts Definition von Semantik zum Erwerb und zur Freigabe, die Sie vielleicht auch nützlich finden.


3
2018-05-10 02:30



Tatsächlich sind diese Operationen in Abschnitt 1.10 / 5-12 definiert.

release/acquire Paar entspricht dem passiert vorher Beziehung; während release/consume Paar zum Abhängigkeitsreihenfolge vorher Beziehung.


3
2018-05-10 02:48



Ich nehme auch an, Semantik zu erwerben / freizugeben, um auf eigene Faust ziemlich definitiv zu sein; obwohl sie hardwarespezifisch eher historisch als programmatisch sind.

Aber ich denke, dass Abschnitt 1.10, Absatz 5 und 6, mit allen Semantikdefinitionen zum Akquirieren / Freigeben übereinstimmen, die ich in anderen Sprachstandards sowie CPU-Definitionen gelesen habe.

Unabhängig davon war einer der wichtigsten Punkte von C ++ 11, ein modernes Speichermodell zu definieren, das gleichzeitig und mit mehreren Threads Code unterstützt. Ich finde es schwer zu glauben, dass sie es nicht richtig verstanden haben :)


0
2018-05-10 02:38