2016-08-11 16 views
5

Từ documentation:Liệu MS-cụ thể biến động ngăn chặn các hướng dẫn phần cứng sắp xếp lại

Microsoft Cụ

Khi/ổn định: ms biên dịch tùy chọn được sử dụng theo mặc định khi kiến ​​trúc khác so với ARM là được nhắm mục tiêu — trình biên dịch tạo thêm mã để duy trì thứ tự trong số các tham chiếu đến các đối tượng dễ bay hơi trong ngoài việc duy trì thứ tự tham chiếu đến các đối tượng toàn cầu khác .Đặc biệt:

  • Ghi vào một đối tượng dễ bay hơi (còn được gọi là viết dễ bay hơi) đã phát hành ngữ nghĩa; có nghĩa là, một tham chiếu đến một đối tượng toàn cục hoặc tĩnh
    xảy ra trước khi ghi vào một đối tượng dễ bay hơi trong lệnh
    trình tự sẽ xảy ra trước khi ghi dễ bay hơi trong biên dịch nhị phân
    .
  • Đọc của một đối tượng dễ bay hơi (còn được gọi là đọc dễ bay hơi) có được ngữ nghĩa; có nghĩa là, một tham chiếu đến một đối tượng toàn cầu hoặc tĩnh
    xảy ra sau khi đọc bộ nhớ dễ bay hơi trong lệnh
    trình tự sẽ xảy ra sau khi đọc dễ bay hơi trong nhị phân đã biên dịch.

Điều này cho phép các đối tượng dễ bay hơi được sử dụng cho các khóa bộ nhớ và phát hành trong các ứng dụng đa luồng.

Nó chắc chắn đảm bảo rằng volatile ngăn biên dịch từ làm hướng dẫn thời gian biên dịch sắp xếp lại (vì nó rõ ràng khẳng định rằng trình tự hướng dẫn sẽ giống nhau trong biên soạn nhị phân).

Nhưng như chúng ta đều biết, cũng có những thứ như sắp xếp lại phần cứng (như CPU ​​có thể sắp xếp lại các chỉ dẫn theo ý muốn của riêng họ). volatile có ngăn chặn nó không? Tôi biết rằng đồng bộ hóa nguyên thủy (như mutexes) làm, nhưng những gì về MS cụ thể volatile?

+1

Bởi "kiến trúc khác ngoài ARM", MS có thể là x86 và x64. Trên x86 và x64, các tải không được sắp xếp lại với các tải khác. Và các cửa hàng không được đặt hàng với các cửa hàng khác. (với một số ngoại lệ như các cửa hàng phi thời gian) IOW, miễn là trình biên dịch không sắp xếp lại bất cứ thứ gì, cũng không phải bộ xử lý. Có vẻ như '/ volatile' cho MS đang cố gắng cung cấp chức năng của' std :: atomic' không tồn tại cho đến C++ 11. – Mysticial

+0

Hơn nữa, họ nói "đã phát hành ngữ nghĩa", vì vậy tài liệu chắc chắn * tuyên bố * 'dễ bay hơi 'ngăn CPU sắp xếp lại. –

+0

@Mysticial "Có vẻ như/volatile cho MS đang cố gắng cung cấp các chức năng của std :: atomic" - không, nó không. Ví dụ, nó không đảm bảo rằng các hoạt động đọc và ghi đối với các biến 'volatile' là nguyên tử. Trong thực tế, chúng - bởi vì x86 đảm bảo nguyên tử của các hoạt động đọc và ghi cho các biến 1 byte, nhưng nó không được bảo đảm trong MSDN bởi 'volatile' – FrozenHeart

Trả lời

7

Tài liệu MSDN về hành vi biến động MS cụ thể sẽ quay trở lại VS2003. Vì vậy, nó được khoảng một thời gian dài trước khi sự tồn tại của std::atomic trong C++ 11.

Vì vậy, MS dễ bay hơi dường như là cách mà người ta đạt được ngữ nghĩa có được/phát hành trong những ngày cũ. Nhưng bây giờ nó về cơ bản là lỗi thời và họ để lại một chú thích thúc đẩy bạn đi từ MS-bay hơi trong lợi std::atomic/volatile:iso cho liên lạc liên thread.


Vì lý do loại trừ ARM, Microsoft không nhận ARM cho đến gần đây. Khác với ARM, chúng hỗ trợ x86, x64 và Itanium (đã chết).

Trên x86 và x64, hầu hết các tải và cửa hàng đều có các ngữ nghĩa thu nhận/giải phóng (ngoại trừ các cửa hàng không theo thời gian). Vì vậy, miễn là trình biên dịch không sắp xếp lại bất cứ điều gì, bộ xử lý sẽ không hoặc là * và do đó sẽ duy trì các ngữ nghĩa thu nhận/giải phóng.Cờ /volatile:ms yêu cầu trình biên dịch không sắp xếp lại thứ gì để có thể đạt được/giải nghĩa ngữ nghĩa trên x86 và x64.

Kể từ hỗ trợ ARM của Microsoft là tương đối mới, và MS-cụ dễ bay hơi (/volatile:ms) là lỗi thời ủng hộ std::atomic, họ có thể quyết định từ bỏ ngữ nghĩa dễ bay hơi cổ điển chứ không phải cập nhật để làm việc trên ARM cũng (mà có lẽ sẽ có nghĩa là thêm rào cản bộ nhớ ở khắp mọi nơi, do thiếu sự hỗ trợ phần cứng).

* Bộ vi xử lý sẽ vẫn làm bất cứ thứ gì sắp xếp lại mà nó muốn, nhưng nó sẽ giữ lại ngữ nghĩa thu nhận/giải phóng của chương trình vì nó được x86/x64 yêu cầu. (trừ các trường hợp ngoại lệ như nt-store hoặc clflush) Làm thế nào để thực hiện điều này mà không vi phạm thứ tự bộ nhớ là một chủ đề khác.

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