[英]C++11 memory orderings- the differences?
我目前正在閱讀Concurrency in Action和第111頁,它提供了與std::atomic_flag
相關的示例代碼,以解釋內存排序的工作原理:
f.clear(std::memory_order_release);
bool x = f.test_and_set();
但它說的是:
這里,對
clear()
的調用顯式請求使用釋放語義清除該標志,而對test_and_set()
的調用使用默認的內存順序來設置標志並檢索舊值。
他們實際上沒有解釋這些差異是什么。 有人可以提供這些內存排序如何工作的一般概述嗎? 所以不僅僅是我上面提到的那個,但我相信還有一些:
memory_order_relaxed
memory_order_release
memory_order_seq_cst
memory_order_consume
memory_order_acquire
memory_order_acq_rel
非正式表征(用一袋鹽服用):
示例(在括號上標記其內存順序的原子操作):
t1: t2:
data = foo while not data_valid; (ACQUIRE)
data_valid = true; (RELEASE) bar = data;
rcu_derefence()
負責在讀取指針和取消引用之間在Alpha上插入讀屏障。 請注意,有一些關於完全改變消耗內存順序規范的討論(在名為“arch:atomic rework”的郵件列表線程上),因為它似乎對編譯器編寫者來說是不切實際的。 特別是,當前標准允許您發布p
,而*(q + (pp))
依賴於此。 有些人認為這完全沒有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.