c++, std:: atomic, czym jest kolejność pamięci std:: i jak z nich korzystać?

Czy ktoś może wyjaśnić czym jest STD::memory_order w prostym języku angielskim i jak ich używać z std:: atomic?

Znalazłem odniesienie i kilka przykładów tutaj, ale nie rozumiem w ogóle. http://en.cppreference.com/w/cpp/atomic/memory_order

Dzięki.
Author: 2607, 2012-03-04

5 answers

Czy ktoś może wyjaśnić czym jest std::memory_order po angielsku,

Najlepsze "po angielsku" wyjaśnienie, jakie znalazłem dla różnych porządków pamięci jest artykuł Bartoza Milewskiego o zrelaksowanej atomice: http://bartoszmilewski.com/2008/12/01/c-atomics-and-memory-ordering/

I post następczy: http://bartoszmilewski.com/2008/12/23/the-inscrutable-c-memory-model/

Ale zauważ, że chociaż te artykuły są dobrym wstępem, to zapoznaj się ze standardem C++11 i nie powie Ci wszystkiego, co musisz wiedzieć, aby bezpiecznie z nich korzystać.

I jak ich używać z std:: atomic?

Moja najlepsza rada dla Ciebie tutaj jest: Nie . Luźne atomiki są (prawdopodobnie) najtrudniejszą i najniebezpieczniejszą rzeczą w C++11. Trzymaj się std::atomic<T> z domyślnym porządkiem pamięci (sekwencyjną konsystencją), dopóki nie będziesz naprawdę pewien, że masz problem z wydajnością, który można rozwiązać za pomocą relaxed memory zamówienia.

W drugim artykule podlinkowanym powyżej Bartosz Milewski dochodzi do następującego wniosku:

Nie miałem pojęcia, w co się pakuję, próbując rozumować o C++ słabe atomiki. Teoria stojąca za nimi jest tak złożona, że jest borderline nie nadaje się do użytku. Zajęło trzy osoby (Anthony, Hans i ja) i modyfikacja standardu w celu uzupełnienia dowodu względnie prosty algorytm. Wyobraź sobie, że robisz to samo dla kolejki bez blokady na słabym atomics!
 21
Author: je4d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 03:38:41

Wartości std::memory_order pozwalają określić drobnoziarniste ograniczenia dotyczące kolejności pamięci zapewnianej przez operacje atomowe. Jeśli modyfikujesz i uzyskujesz dostęp do zmiennych atomowych z wielu wątków, przekazanie wartości std::memory_order do operacji pozwala relaksować ograniczenia na kompilatorze i procesorze dotyczące kolejności, w jakiej operacje na tych zmiennych atomowych stają się widoczne dla innych wątków, a efekty synchronizacji te operacje mają na innych wątkach. dane w Twojej aplikacji.

Domyślna kolejność std::memory_order_seq_cst jest najbardziej ograniczona i zapewnia" intuicyjne " właściwości, których można się spodziewać: jeśli wątek A przechowuje pewne dane i ustawia flagę atomową za pomocą std::memory_order_seq_cst, to jeśli wątek B widzi, że flaga jest ustawiona, to może zobaczyć, że dane zapisane przez wątek A. inne wartości porządkowania pamięci niekoniecznie zapewniają tę gwarancję i dlatego muszą być używane bardzo ostrożnie.

Podstawowe założenie brzmi: nie używaj niczego innego niż std::memory_order_seq_cst (domyślne) chyba, że (a) naprawdę naprawdę wiesz, co robisz i możesz udowodnić, że swobodne użycie jest bezpieczne we wszystkich przypadkach, oraz (b) Twój profiler demonstruje, że struktura danych i operacje, z którymi zamierzasz korzystać z swobodnych zamówień, są wąskim gardłem.

Moja książka, współbieżność C++ w działaniu poświęca cały rozdział (45 stron) szczegółom modelu pamięci C++, operacji atomowych i ograniczeń std::memory_order, a także kolejny rozdział (44 strony) do wykorzystania operacji atomowych do synchronizacji w strukturach danych bez blokady i konsekwencji złagodzonych ograniczeń porządkowania.

Moje wpisy na blogu algorytm Dekkera i algorytm Petersona dla wzajemnego wykluczenia pokazują niektóre z problemów.

 32
Author: Anthony Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 10:11:52

Nie. Wyjaśnienie po angielsku zajmuje 32 strony i można je znaleźć tutaj .

Jeśli nie chcesz tego czytać, możesz zapomnieć o porządkowaniu pamięci, ponieważ strona, z którą się łączyłeś mówi, że domyślne jest kolejność Sekwencyjna, czyli "zawsze rób rozsądne rzeczy" - ustawienie.

Aby użyć dowolnego innego ustawienia, naprawdę musisz przeczytać i zrozumieć powyższy artykuł i zawarte w nim przykłady.

 14
Author: zvrba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 09:10:39

W skrócie, Twój kompilator i procesor mogą wykonywać instrukcje w kolejności innej niż ta, w jakiej je napisałeś. W przypadku pojedynczego wątku nie jest to problem, ponieważ wydaje się poprawny. W przypadku wielu wątków na wielu procesorach staje się to problemem. Porządkowanie pamięci w C++ ogranicza możliwości kompilatora / procesora i rozwiązuje takie problemy.

Na przykład, jeśli spojrzysz na mój artykuł o double-check locking możesz zobaczyć, jak porządkowanie bałaganu z tym wzorem -- wspomnij Pokaż atomic kolejność pamięci może być użyta do jej naprawienia.

Jeśli chodzi o samą zmianę kolejności, możesz również rozważyć zmianę kolejności procesora -- ponownie, kompilator może również wykonywać zmiany kolejności.

Należy pamiętać, że wszelkie dokumenty na ten temat (w tym moje) oferują mówić o scenariuszach teoretycznych. Najczęstsze procesory, takie jak x86, mają bardzo silne Gwarancje zamawiania, takie, że wiele wyraźnych zamówień po prostu nie jest potrzebne. Tak więc nawet jeśli nie użyjesz WŁAŚCIWEGO atomiki C++11, Twój kod prawdopodobnie nadal działa.

Jak wspomniano zvrba, temat jest właściwie dość szczegółowy. Dokument jądra Linuksa o barierach pamięci zawiera również wiele szczegółowych informacji.

 5
Author: edA-qa mort-ora-y,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 11:37:49

Jest jakiś zwykły angielski w GCC wiki. ;)

Http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync

 4
Author: plan9assembler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-12 14:26:15