2011-09-09 2 views
37

새로운 C++ 표준은 메모리 모델이라는 개념을 도입했습니다. 그래서 그것에 대한 의문이 이미있었습니다. 그게 무슨 뜻 이죠, 우리가 C++로 코드를 작성하는 방식을 어떻게 바꿀까요?Java 메모리 모델과 C++ 11 메모리 모델 사이의 유사점은 무엇입니까?

C++ 메모리 모델이 이전의 잘 알려진 java 메모리 모델 (1.5)과 어떤 관련이 있는지 알고 싶습니다. 똑같은가요? 비슷한가요? 그들은 큰 차이가 있습니까? 그렇다면 왜?

자바 메모리 모델은 오랫동안 사용되어 왔고 많은 사람들이 꽤 알기 때문에 C++ 메모리 모델을 배우고 Java 코드와 비교하여 도움이 될 것으로 생각합니다. .

+0

C++의 메모리 모델은 컴파일러에 따라 다르지만 그렇지 않습니까? 어쨌든 C++ 03과 C++ 11은 동일해야합니다. –

+10

아니요, C++ 11에서는 동시성을위한 플랫폼 독립적 메모리 모델을 도입했습니다. 이것은 C++의 멀티 스레드 프로그래밍에서 획기적인 발전입니다. – ciamej

+12

왜 건설적이지 않습니까? 나는 유사점과 차이점을 지적하는 것이 매우 객관적이라고 생각합니다. 답변에는 사실 (Java가 수행하는 동안 C++ 11은 X를 수행하지 않음), 참조 (C++ 11 표준 섹션 Y 참조) 또는 특정 전문 지식이 포함됩니다. –

답변

21

자바 메모리 모델은 C++ 11 메모리 모델에 중요한 영향을, 그리고 우리가 용어 전에-발생 동기화-과에서 뽑아 곳이었다. 그러나 C++ 11 메모리 모델은 Java 메모리 모델보다 메모리 정렬에 대한 훨씬 더 세밀한 제어를 제공합니다. 당신이 읽기 std::memory_order_acquire 메모리 주문, 쓰기에 대한 std::memory_order_release 주문 및 RMW 작업을위한 std::memory_order_acq_rel 순서를 사용하는 경우

자바 volatile 변수는 C++ 11 개 std::atomic<> 변수에 해당합니다.

std::memory_order_relaxed 또는 std::memory_order_seq_cst과 Java가 동일한 것은 아닙니다.

+0

+1. 좋은 대답. 'C++ Concurrency in Action'에 대한 책을 작성 했으므로이 주제에 대한 답을 게시하면 좋을 것입니다 : [C++ 0x는 표준화 된 메모리 모델을 소개합니다. 무슨 뜻이에요? 그리고 C++ 프로그래밍에 어떤 영향을 미치게 될까요?] (http://stackoverflow.com/questions/6319146/c0x-introduces-a-standardized-memory-model-what-does-it-mean-and-how-is- it-go) – Nawaz

+2

java volatile은 C++ std :: memory_order_seq_cst와 같습니다. 사실, 자바에서는 IRIW 케이스가 시퀀스 일관성을 가져야한다. [this] (http://shipilev.net/blog/2014/jmm-pragmatics/), [this] (http://llvm.org/docs/Atomics.html) 및 [this] (http : // stackoverflow.com/questions/24492061/the-volatile-keyword-and-memory-consistency-errors). –