2011-09-09 16 views
37

Nowy standard C++ wprowadza pojęcie modelu pamięci. Były już pytania na temat SO, co to znaczy, jak to zmienia sposób pisania kodu w C++ i tak dalej.Jakie są podobieństwa między modelem pamięci Java a modelem pamięci C++ 11?

Chcę się dowiedzieć, jak model pamięci C++ jest powiązany ze starszym, dobrze znanym modelem pamięci Java (1.5). Czy to to samo? Czy to jest podobne? Czy mają jakieś znaczące różnice? Jeśli tak, dlaczego?

Model pamięci java istnieje od dawna i wielu ludzi wie o tym całkiem przyzwoicie, więc myślę, że może być pomocne, nie tylko dla mnie, poznanie modelu pamięci C++, poprzez porównanie go z wersją java. .

+0

Model pamięci dla C++ zależy od kompilatora, nie? W każdym razie powinno to być takie samo dla C++ 03 i C++ 11 –

+10

Nie, C++ 11 wprowadza niezależny od platformy model pamięci dla współbieżności. Jest to duży przełom w programowaniu wielowątkowym w języku C++. – ciamej

+12

Dlaczego to nie jest konstruktywne? Myślę, że wskazywanie podobieństw i różnic jest bardzo obiektywną rzeczą. Odpowiedzi na pewno będą zawierały fakty (C++ 11 nie robi X, podczas gdy Java ma), referencje (patrz standardowa sekcja C++ 11) lub konkretna wiedza. –

Odpowiedz

21

model pamięci Java był istotny wpływ na modelu pamięci C++ 11, i był tam gdzie wyciągnął terminy dzieje, zanim i synchronizuje-z od. Jednak model pamięci C++ 11 oferuje znacznie dokładniejszą kontrolę nad porządkowaniem pamięci niż model pamięci Java.

Java volatile zmienne są równoważne C++ 11 std::atomic<> zmiennych, jeśli używasz std::memory_order_acquire pamięci zamawianie brzmi std::memory_order_release zamawianie pisze i std::memory_order_acq_rel zamawianie operacji RMW.

Nie ma odpowiednika w Javie do std::memory_order_relaxed lub std::memory_order_seq_cst.

+0

+1. Niezła odpowiedź. Odkąd napisałeś książkę na temat 'Współzależności C++ w działaniu ', byłoby miło (i byłbym szczególnie szczęśliwy), jeśli zamieścisz odpowiedź tutaj w tym temacie: [C++ 0x wprowadza znormalizowany model pamięci. Co to znaczy? I jak to wpłynie na programowanie w C++?] (Http://stackoverflow.com/questions/6319146/c0x-introduces-i-standardized-memory-model-what-does-it-mean-and-how-is- it-go) – Nawaz

+2

Wygląda na to, że java volatile jest odpowiednikiem C++ std :: memory_order_seq_cst. W rzeczywistości, w java, przypadek IRIW musi być zgodny sekwencyjnie. Zobacz [to] (http://shipilev.net/blog/2014/jmm-pragmatics/), [this] (http://llvm.org/docs/Atomics.html) i [this] (http: // stackoverflow.com/questions/24492061/the-volatile-key-word-and-memory-consistency-errors). –

Powiązane problemy