簡體   English   中英

寬松原子操作的內存模型釋放/獲取模式交互

[英]Memory model release/acquire mode interactions of relaxed atomic operations

GCC Wiki 關於內存模型同步模式Acquire/Release 是這樣說的

更復雜的是,非原子變量的相互作用仍然相同。 原子操作之前的任何存儲都必須在其他同步線程中看到。 例如:

  -線程 1-\n  y = 20;\n  x.store (10, memory_order_release);\n\n  -線程 2-\n 如果(x.load(memory_order_acquire)== 10)\n    斷言(y == 20);
由於“y”不是原子變量,“y”的存儲發生在“x”的存儲之前,因此在這種情況下斷言不會失敗。 優化器仍然必須限制圍繞原子操作對共享內存變量執行的操作。

現在,如果我讓 'y' 成為一個原子變量(不強加發生之前的限制)怎么辦?

 -Thread 1-
 y.store (20, memory_order_relaxed);
 x.store (10, memory_order_release);

 -Thread 2-
 if (x.load(memory_order_acquire) == 10)
    assert (y.load (memory_order_relaxed) == 20);

斷言會失敗嗎? 對原子變量的要求是否比對非原子變量的要求少? 或者 Wiki 對非原子變量的限制在這里是無緣無故的和誤導性的?

由於“y”不是原子變量,“y”的存儲發生在“x”的存儲之前

語句“因為y不是原子的”是不正確的。相同的排序規則適用於原子和非原子操作。

獲取/釋放屏障保證內存操作 A(存儲到y )在存儲/釋放發生之前排序- 在內存操作 B( assert )之前排序在看到存儲值的加載/獲取之后。 操作 A 和 B 是否是原子的無關緊要。
assert不能觸發。

暫無
暫無

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

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