2011-09-09 6 views
37

Chuẩn C++ mới giới thiệu khái niệm về một mô hình bộ nhớ. Đã có những câu hỏi trên SO về nó, nó có nghĩa là gì, nó thay đổi cách chúng ta viết mã trong C++ và vân vân.Các điểm tương đồng giữa mô hình bộ nhớ Java và mô hình bộ nhớ C++ 11 là gì?

Tôi quan tâm đến việc biết mô hình bộ nhớ C++ liên quan đến mô hình bộ nhớ java cũ hơn, nổi tiếng (1.5) như thế nào. Nó giống nhau không? Nó có giống nhau không? Họ có bất kỳ sự khác biệt đáng kể nào không? Nếu vậy, tại sao?

Mô hình bộ nhớ java đã có từ rất lâu và nhiều người biết nó khá rõ ràng, vì vậy tôi đoán nó có thể hữu ích, không chỉ cho tôi, để tìm hiểu mô hình bộ nhớ C++, bằng cách so sánh nó với java .

+0

Mô hình bộ nhớ cho C++ phụ thuộc vào trình biên dịch, phải không? Dù sao, nó sẽ giống nhau cho C++ 03 và C++ 11 –

+10

Không, C++ 11 giới thiệu một mô hình bộ nhớ độc lập nền tảng cho đồng thời. Đây là một bước đột phá lớn cho lập trình đa luồng trong C++. – ciamej

+12

Tại sao điều này không mang tính xây dựng? Tôi nghĩ rằng điểm tương đồng và khác biệt là một điều rất khách quan. Câu trả lời chắc chắn sẽ liên quan đến sự kiện (C++ 11 không làm X trong khi Java làm), tài liệu tham khảo (Xem C + + 11 phần tiêu chuẩn Y), hoặc chuyên môn cụ thể. –

Trả lời

21

mô hình bộ nhớ Java là một ảnh hưởng quan trọng trên mô hình bộ nhớ C++ 11, và là nơi mà chúng tôi kéo các điều khoản xảy ra-trướcđồng bộ hóa với các từ. Tuy nhiên, mô hình bộ nhớ C++ 11 cung cấp khả năng kiểm soát chi tiết hơn đối với việc đặt hàng bộ nhớ hơn mô hình bộ nhớ Java.

Java volatile biến là tương đương với 11 std::atomic<> C++ biến, nếu bạn sử dụng std::memory_order_acquire đặt hàng bộ nhớ cho lần đọc, std::memory_order_release đặt hàng cho lần ghi, và std::memory_order_acq_rel đặt hàng cho các hoạt động RMW.

Không có tương đương trong Java tới std::memory_order_relaxed hoặc std::memory_order_seq_cst.

+0

+1. Câu trả lời hay. Vì bạn đã viết một cuốn sách về 'C++ Concurrency in Action', nó sẽ rất hay (và tôi đặc biệt hạnh phúc) nếu bạn đăng câu trả lời ở đây trong chủ đề này: [C++ 0x giới thiệu một mô hình bộ nhớ tiêu chuẩn hóa. Nó có nghĩa là gì? Và làm thế nào nó sẽ ảnh hưởng đến lập trình C++?] (Http://stackoverflow.com/questions/6319146/c0x-introduces-a-standardized-memory-model-what-does-it-mean-and-how-is- it-go) – Nawaz

+2

Dường như java dễ bay hơi tương đương với C++ std :: memory_order_seq_cst. Trong thực tế, trong java, trường hợp IRIW phải là chuỗi nhất quán. Xem [this] (http://shipilev.net/blog/2014/jmm-pragmatics/), [this] (http://llvm.org/docs/Atomics.html) và [this] (http: // stackoverflow.com/questions/24492061/the-volatile-key-word-and-memory-consistency-errors). –