2012-06-27 28 views
11

Có trình biên dịch C hoặc C++ nào ở đó thực hiện mô hình nhất quán "tích cực" cho biến số volatile không? Theo mô hình nhất quán "tích cực", tôi đồng nghĩa với việc viết tất cả các biến cho các biến số volatile với các rào cản bộ nhớ trong mã được tạo.Trình biên dịch C và C++ với ngữ nghĩa dễ bay hơi "tích cực"

AFAIK, đây là hành vi thông thường đối với trình biên dịch C hoặc C++ trên nền tảng IA64 (Itanium). Điều gì về x86? Có một trình biên dịch ra có thực hiện (hoặc có thể được cấu hình để thực hiện) Cách tiếp cận giống như Itanium để xử lý các biến số volatile trên nền tảng x86?

Edit: Tôi nhìn vào mã VS 2005 tạo ra (sau khi đọc các ý kiến) và tôi không thấy bất cứ điều gì mà sẽ giống như bất kỳ loại hàng rào bộ nhớ khi truy cập vào volatile biến. Điều này là hoàn toàn tốt đẹp để đảm bảo tính nhất quán của bộ nhớ trên một nền tảng đa lõi x86 một CPU, vì các giao thức bộ nhớ cache MESIF (Intel) và MOESI (AMD).

Tuy nhiên, điều này dường như không đủ trên nền tảng SMP x86 đa CPU. Một nền tảng SMP sẽ yêu cầu các rào cản bộ nhớ trong mã được tạo ra để đảm bảo tính nhất quán của bộ nhớ giữa các CPU. Tôi đang thiếu gì? Chính xác những gì Microsoft có ý nghĩa khi họ tuyên bố rằng họ đã có ngữ nghĩa phát hành có được trên các biến số volatile?

+3

[Theo Raymond Chen] (https://blogs.msdn.com/b/oldnewthing/archive/2011/04/19/10155452.aspx?Redirected=true) bạn nhận được hành vi này với VS2005 và mới hơn – Praetorian

+2

@ Người viết: [Theo tài liệu chính thức] (http://msdn.microsoft.com/en-us/library/12a04hfd.aspx). ; -] – ildjarn

+0

@AndreyT: Bạn có đang thử nghiệm VC++ 2005 hoặc VC++ 2005 SP1 không? IIRC, VC++ 2005 RTM có lỗi trong đó 'volatile' không có ngữ nghĩa dự kiến, đã được sửa trong SP1 và VC++ 2008+. – ildjarn

Trả lời

2

Cần lưu ý rằng các CPU x86 sắp xếp lại không tải với các tải khác hoặc lưu trữ với các cửa hàng khác. Như vậy, không có rào cản rõ ràng là cần thiết.

Trình biên dịch MSVC sẽ đảm bảo rằng các tải không được sắp xếp lại với các tải dễ bay hơi và các cửa hàng không được sắp xếp lại với các cửa hàng dễ bay hơi (tất nhiên là tôi đang nói về việc tải lại và hướng dẫn lưu trữ), đảm bảo có được và phát hành ngữ nghĩa tải và lưu trữ tương ứng.

+0

Điều đó có đúng ngay cả đối với trường hợp nhiều CPU (trái ngược với trường hợp đa lõi CPU đơn) không? – AnT

+0

@AndreyT, thứ tự mà xe buýt bên ngoài nhìn thấy tải trọng cũng giống như thứ tự các chỉ dẫn tải. Điều này cũng đúng cho các cửa hàng. Như bạn đã lưu ý, các giao thức cache đảm bảo tính nhất quán. Nói cách khác, nếu CPU1 thực hiện một cửa hàng S và CPU2 thấy cửa hàng đó với tải L, sau đó tải bởi CPU2 theo L sẽ thấy tất cả các cửa hàng bằng CPU1 trước S. Và đó là bạn của tôi, có được/giải nghĩa ngữ nghĩa :) – avakar

+0

@AndreyT, tôi không có nghĩa là để rant, nhưng tôi muốn các C + + ủy ban đã thực hiện các "dễ bay hơi đã có được/phát hành ngữ nghĩa" đảm bảo tiêu chuẩn thay vì đến với ''. – avakar

Các vấn đề liên quan