[英]Does the C++11 standard formally define acquire, release, and consume operations?
在C ++ 11標准中,第1.10 / 5節提到,但沒有正式定義術語acquire operation
, release operation
和consume operation
。 然后在第29節繼續使用這些術語來描述某些內存排序,原子操作和內存柵欄的操作。 例如,關於“順序和一致性”的29.3 / 1表示:
memory_order_release , memory_order_acq_rel和memory_order_seq_cst :存儲操作在受影響的內存位置上執行釋放操作 [強調添加]。
這種類型的語言在第29節中重復出現,但令我memory_order
是, memory_order
枚舉的所有含義都基於操作類型,這些操作類型本身似乎沒有被標准形式化,但必須具有一些共同的意義。它們作為定義有效。
換句話說,如果我說“一個酒吧是一個翻轉的foo”, bar和foo的具體含義是模棱兩可的,因為這兩個術語都沒有正式定義。 只定義了它們的相對性質。
C ++ 11標准或其他一些C ++ 11標准委員會文檔是否正式定義了acquire operation
, release operation
等的確切內容,或者這些是通常理解的術語? 如果是后者,是否有一個很好的參考被認為是這些操作含義的行業標准? 我特別要求,因為硬件內存一致性模型不是相同的,因此我認為必須有一些共同商定的引用,允許那些實現編譯器等的人正確地將這些操作的語義轉換為本機程序集命令。
其中一個注釋中給出了非正式的匯總定義:
對
A
執行釋放操作會強制對其他存儲器位置的先前副作用對其他線程可見,以便稍后對A
執行消耗或獲取操作。
除此之外,獲取和釋放操作的行為在1.10中完全定義,特別是它們如何在關系之前發生 。 除了行為之外的任何定義都是無用的。
在快速瀏覽標准之后,我沒有看到任何關於獲取/發布語義的正式定義,所以我猜測它們被認為是通常理解的術語。
畢竟,他們無法定義一切。
這不是一個明確的參考,但Raymond Chen在博客上發表了關於獲取/發布語義的文章 。 他的帖子包含了微軟對獲取和發布語義的定義的鏈接 ,您可能也會發現它很有用。
實際上,這些操作在1.10 / 5-12節中定義。
release/acquire
對對應於關系之前發生 ; 而release/consume
對在關系之前依賴於順序排列 。
我也認為獲取/釋放語義是相當明確的; 雖然它們在歷史上比硬件特定術語更多,而不是編程術語。
但是,我認為第1.10節第5和第6節似乎與我在其他語言標准中讀取的所有獲取/釋放語義定義以及CPU定義相匹配。
無論如何,C ++ 11的一個主要觀點是定義一個現代內存模型來支持並發和多線程代碼。 我發現很難相信他們沒有把它弄好:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.