簡體   English   中英

C ++ 11內存排序 - 差異?

[英]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

非正式表征(用一袋鹽服用):

  • SEQ_CST:只要沒有數據爭用 ,代碼就像是一個簡單的線程交錯一樣,沒有重新排序的可觀察性。
  • RELEASE / ACQUIRE:發布“發布”一個寫,並且該相同內存位置的讀取與該寫同步。 例如,互斥鎖可以執行ACQUIRE ,互斥鎖可以解鎖RELEASE 另一個例子:

示例(在括號上標記其內存順序的原子操作):

t1:                                   t2:
   data = foo                            while not data_valid; (ACQUIRE)
   data_valid = true; (RELEASE)          bar = data;
  • ACQ_REL:對原子RMW(讀 - 修改 - 寫)操作進行獲取和釋放。 請注意,您可以指定將ACQ_REL用於成功的RMW,如果RMW操作失敗,則指定另一個內存順序。
  • RELEASE / CONSUME:您發布一個指向結構的指針,並且讀取“消耗”該發布,並且可以訪問指向的數據。 一些Alpha處理器具有拆分緩存,這意味着您可能正在從緩存庫中讀取指針,並且指向的數據可能不會仍然存在於該緩存的其他存儲庫中。 在Linux上實現的RCU中, rcu_derefence()負責在讀取指針和取消引用之間在Alpha上插入讀屏障。 請注意,有一些關於完全改變消耗內存順序規范的討論(在名為“arch:atomic rework”的郵件列表線程上),因為它似乎對編譯器編寫者來說是不切實際的。 特別是,當前標准允許您發布p ,而*(q + (pp))依賴於此。 有些人認為這完全沒有意義。
  • 放松:對所有人免費。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM