2012-05-10 8 views
21

W standardzie C++ 11 sekcja 1.10/5 wymienia, ale nie definiuje formalnie terminów: acquire operation, release operation i consume operation. Następnie w rozdziale 29 używa się tych terminów, aby opisać działania niektórych uporządkowanych pamięci, operacji atomowych i ogrodzeń pamięci. Na przykład, 29,3/1 na "porządek i spójność" stwierdza:Czy standard C++ 11 formalnie definiuje operacje pobierania, wydania i używania?

memory_order_release, memory_order_acq_rel i memory_order_seq_cst: operacja sklep wykonuje operację Release [podkreślenie własne] w pamięci dotkniętego Lokalizacja.

Ten typ języka jest powtarzany w całej sekcji 29, ale to nie przeszkadza mi trochę, że wszystkie znaczenia dla memory_order wyliczenia oparte są na rodzaje operacji, które same nie wydają się być sformalizowane w normie, ale musi mieć pewne wspólnie uzgodnione znaczenie, aby były skuteczne jako definicje.

Put inny sposób, gdybym powiedział „bar jest przerzucony foo”, beton sens pasku i foo są niejednoznaczne, ponieważ ani termin jest formalnie zdefiniowany. Określa się tylko ich względną naturę.

Czy standard C++ 11, czy jakikolwiek inny dokument komitetu standardu C++ 11 formalnie definiuje, czym dokładnie są acquire operation, release operation itd., Czy są to po prostu powszechnie rozumiane terminy? Jeśli to drugie, czy istnieje dobre odniesienie, które jest uważane za standard branżowy dla znaczenia tych operacji? Pytam konkretnie, ponieważ modele spójności pamięci sprzętowej nie są sobie równe, a zatem domyślam się, że musi być jakieś uzgodnione odniesienie, które pozwala tym, którzy implementują kompilatory itp., Odpowiednio tłumaczyć semantykę tych operacji na natywne komendy zespołu.

+1

Zgadzam się z PO. To, czy standard jest logicznie możliwy do odczytania, to jedno pytanie, ale w każdym razie norma jest niezwykle myląca w tym konkretnym punkcie. – thb

+0

[Blog Jeffa Preshinga o wydaniu/nabyciu] (http://preshing.com/20120913/acquire-and-release-semantics/) definiuje je pod kątem wymaganego zamówienia w odniesieniu do wcześniejszych/późniejszych ładunków/sklepów, w sposób zgodny z semantyką C++ 11. Nie zdawałem sobie sprawy, że C++ 11 formalnie nie definiuje ich w terminach takich jak ten. –

Odpowiedz

6

Jest nieformalny zestawione definicja podana w jednej dodatkowej:

wykonywania operacji zwalniający A sił stanu skutków ubocznych w innych miejscach pamięci stają się widoczne dla innych nici później przeprowadzić spożywać albo nabyć operacja na A.

Poza tym zachowanie operacji nabywania i uwalniania jest w pełni zdefiniowane w 1.10, a konkretnie w jaki sposób przyczyniają się one do dzieje, zanim relacji. Każda definicja oprócz zachowania jest bezużyteczna.

+0

Sądzę, że to "nieformalne podsumowania" tak mnie niepokoją. Na przykład, jeśli próbujesz odwzorować operację zwolnienia na instrukcje sprzętowe dla danej platformy, musisz wiedzieć, co jest i nie jest dozwolone semantycznie, ponieważ sprzęt może nie zapewniać określonej operacji "zwolnienia". Ponieważ nie ma korespondencji jeden-do-jednego, bardziej formalne znaczenie może pomóc w dokładnych tłumaczeniach. Biorąc to pod uwagę, ponownie przeczytam sekcję 1.10 i zobaczę, czy nie mogę głębiej zrozumieć mostu pomiędzy opisywanym zachowaniem, a faktycznym użyciem samych terminów operacyjnych. – Jason

+1

@Jason: Standard koncentruje się na zachowaniu. Nie próbuje definiować terminów w izolacji. –

+0

@Jason, Należy zauważyć, że nawet w dokumentach technicznych firmy Intel gwarancje kolejności pamięci są również opisane w pewnym stopniu jako gwarancja zamawiania zachowań. Oznacza to, że porządkowanie pamięci jest zachowaniem kontrolowanym przez szereg instrukcji. Sposób, w jaki uporządkowane gwarancje C++ są osiągane, może różnić się od kompilatora do kompilatora dla tej samej platformy, a na pewno będzie dla innego sprzętu. –

3

Nie widzę żadnej formalnej definicji semantyki nabycia/zwolnienia po szybkim przejrzeniu standardu, więc domyślam się, że są one uważane za powszechnie rozumiane terminy.

W końcu nie potrafią zdefiniować wszystkiego.

To nie jest ostateczne odniesienie, ale Raymond Chen has blogged about acquire/release semantics. Jego wpis zawiera a link to Microsoft's definition of acquire and release semantics, który możesz również znaleźć przydatne.

+0

Należy również wziąć pod uwagę podstawowe dokumenty ISO, np. C i Unicode (10646). – MSalters

0

Podejmuję także semantykę nabycia/wydania, aby być dość definitywnym na swój własny; chociaż są to terminy bardziej specyficzne dla sprzętu historycznie niż terminy programowania.

Ale myślę, że sekcja 1.10 pkt 5 i 6 wydaje się pasować do wszystkich definicji semantycznych nabycie/wydanie, które czytałem w innych standardach językowych, a także definicje CPU.

Bez względu na to, jednym z głównych punktów C++ 11 było zdefiniowanie nowoczesnego modelu pamięci do obsługi współbieżnego i wielowątkowego kodu. Trudno mi uwierzyć, że nie zrobili tego dobrze :)

3

faktycznie te operacje są zdefiniowane w sekcji 1.10/5-12.

release/acquire para odpowiada zdarzeniu przed; podczas gdy release/consume paruje z zależnością -uporządkowaną przed relacją.