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.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!
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.
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.
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.
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. ;)
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