2012-05-10 34 views
21

Trong tiêu chuẩn C++ 11, mục 1.10/5 đề cập, nhưng không chính thức xác định các điều khoản acquire operation, release operationconsume operation. Sau đó nó tiếp tục trong Phần 29 để sử dụng các thuật ngữ này để mô tả các hành động của các thứ tự bộ nhớ nhất định, các hoạt động nguyên tử và các hàng rào bộ nhớ. Ví dụ, 29,3/1 vào "Đặt hàng và nhất quán" khẳng định:Chuẩn C++ 11 có định nghĩa chính xác các hoạt động có được, giải phóng và tiêu thụ không?

memory_order_release, memory_order_acq_relmemory_order_seq_cst: một hoạt động cửa hàng thực hiện một hoạt động phát hành [nhấn mạnh thêm] trên bộ nhớ bị ảnh hưởng vị trí.

Đây là loại ngôn ngữ được lặp đi lặp lại trong suốt phần 29, nhưng nó làm tôi bực mình một chút rằng tất cả ý nghĩa cho memory_order enumerations được dựa trên các loại hoạt động mà bản thân chúng dường như không được chính thức theo tiêu chuẩn, nhưng phải có một số thường được thỏa thuận để có hiệu quả như định nghĩa.

Đặt một cách khác, nếu tôi nói: "Một thanh là một foo lật", ý nghĩa cụ thể của thanhfoo là mơ hồ vì không hạn được chính thức xác định. Chỉ tính chất tương đối của chúng được xác định.

Chuẩn C++ 11 hay một số tài liệu ủy ban tiêu chuẩn C++ 11 chính thức xác định chính xác một số acquire operation, release operation, v.v ... hoặc là những thuật ngữ này thường được hiểu? Nếu sau này, có một tài liệu tham khảo tốt được coi là một tiêu chuẩn công nghiệp cho ý nghĩa của các hoạt động này? Tôi đặc biệt yêu cầu vì các mô hình bộ nhớ phần cứng không được tạo ra bằng nhau, và vì vậy tôi phải có một số tham chiếu được đồng ý chung để cho phép những người thực hiện các trình biên dịch, vv để dịch đúng ngữ nghĩa của các hoạt động này sang các lệnh lắp ráp gốc.

+1

Tôi đồng ý với OP. Liệu tiêu chuẩn có được giải mã một cách hợp lý hay không là một câu hỏi, nhưng ở bất kỳ mức nào, tiêu chuẩn này gây nhầm lẫn bất thường về điểm đặc biệt này. – thb

+0

[bài viết trên blog của Jeff Preshing về phát hành/Có được] (http://preshing.com/20120913/acquire-and-release-semantics/) định nghĩa chúng về trật tự cần thiết đối với với trước/tải sau/cửa hàng, trong một cách tương thích với ngữ nghĩa C++ 11. Tôi đã không nhận ra rằng C++ 11 đã không chính thức định nghĩa chúng theo cách như thế này. –

Trả lời

6

Có một định nghĩa tóm tắt chính thức được đưa ra trong một trong những ghi chú:

thực hiện một hoạt động phát hành trên A lực tác dụng phụ trước khi vào vị trí bộ nhớ khác để trở thành có thể nhìn thấy chủ đề khác mà sau này thực hiện một tiêu thụ hoặc một Acquire hoạt động trên A.

Bên cạnh đó, hành vi của các hoạt động tiếp thu và phát hành được đầy đủ quy định tại 1.10, đặc biệt là trong cách họ đóng góp cho xảy ra-trước mối quan hệ. Bất kỳ định nghĩa nào ngoài hành vi đều vô dụng.

+0

Tôi đoán đó là "tóm lược không chính thức" khiến tôi lo lắng. Ví dụ, nếu bạn cố gắng ánh xạ một hoạt động phát hành đến các hướng dẫn phần cứng cho một nền tảng nhất định, bạn phải biết cái gì là và không được phép ngữ nghĩa, vì phần cứng có thể không cung cấp một số hoạt động "giải phóng" cụ thể. Vì không có sự tương ứng một-một, một ý nghĩa chính thức hơn có thể giúp đỡ với các bản dịch chính xác. Điều đó đang được nói, tôi sẽ đọc lại phần 1.10 và xem liệu tôi có thể hiểu rõ hơn về cầu nối giữa hành vi mà bạn mô tả hay không và việc sử dụng thực tế các thuật ngữ hoạt động. – Jason

+1

@ Jason: Tiêu chuẩn tập trung vào hành vi. Nó không cố gắng để xác định các điều khoản trong sự cô lập. –

+0

@ Jason, Cần lưu ý rằng ngay cả trong tài liệu kỹ thuật của Intel bảo đảm thứ tự bộ nhớ cũng được mô tả phần nào là bảo đảm trật tự hành vi. Đó là, thứ tự bộ nhớ là một hành vi được điều khiển bởi một loạt các hướng dẫn. Làm thế nào các thứ tự đảm bảo C++ đạt được có thể khác với trình biên dịch cho trình biên dịch cho cùng một nền tảng, và chắc chắn sẽ dành cho các phần cứng khác nhau. –

3

Tôi không thấy bất kỳ định nghĩa chính thức nào về ngữ nghĩa thu nhận/phát hành sau khi xem nhanh thông qua tiêu chuẩn, do đó, tôi đoán là chúng được giả định là các thuật ngữ thông dụng.

Sau cùng, chúng không thể xác định được mọi thứ.

Đây không phải là tham chiếu chính xác, nhưng Raymond Chen has blogged about acquire/release semantics. Bài đăng của anh ấy bao gồm a link to Microsoft's definition of acquire and release semantics, mà bạn cũng có thể thấy hữu ích.

+0

Bạn cũng nên xem xét các tài liệu ISO cơ sở, ví dụ: C và Unicode (10646). – MSalters

0

Tôi cũng lấy các ngữ nghĩa có được/giải phóng tương đối dứt khoát về chính nó; mặc dù chúng có nhiều thuật ngữ cụ thể về mặt phần cứng hơn là các thuật ngữ lập trình.

Nhưng, tôi nghĩ phần 1.10 đoạn 5 và 6 có vẻ khớp với tất cả các định nghĩa ngữ nghĩa có được/phát hành mà tôi đã đọc ở các tiêu chuẩn ngôn ngữ khác cũng như các định nghĩa CPU.

Bất kể, một trong những điểm chính của C++ 11 là xác định mô hình bộ nhớ hiện đại để hỗ trợ mã đồng thời và đa luồng. Tôi thấy khó tin rằng họ không hiểu đúng :)

3

thực sự các hoạt động này được xác định trong phần 1.10/5-12.

release/acquire cặp tương ứng với số xảy ra trước mối quan hệ; trong khi release/consume cặp với phụ thuộc theo lệnh trước mối quan hệ.

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