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