記憶體模型與原子操作

原子變數的修改順序(modification order)

即使在最狂野的弱序、處處 relaxed 的世界裡,記憶體模型仍免費交給你「一個」堅如磐石的保證:每一個原子物件都有單一的、全序的修改順序——一個對它所曾寫入之所有值的確定序列,每個執行緒都同意。想像那一個變數附帶一本日誌,其中每次寫入都以一個無可爭辯的順序蓋上戳記;任何兩個執行緒都不會對那本簿子的內容有異議。

這給你什麼,即使是 memory_order_relaxed:一個執行緒反覆讀同一個原子,絕不會看到它的值在那個順序裡「倒退」(單一位置沒有時光旅行),而它上面所有的讀改寫操作都乾淨地嵌進那個順序,使得沒有兩個 CAS 能同時「贏得」同一步。這個每物件的全序,是底下一切的 relaxed 層級骨架;從語言這一側看,它正是 coherence 保證。它「不」給你的,是不同原子「之間」的任何排序——那是 happens-before、屏障與更強順序的工作。

它也框出了一個深刻、大致屬於理論的隱憂:憑空(out-of-thin-air,OOTA)值。把光禿禿的 relaxed 規則推到邏輯極端,似乎允許出現一個值,而它唯一的依據是一條循環、自我實現的推測讀寫鏈——一個沒有任何真實程式算出來、「憑空」變出來的數字。實務上沒有任何理智的編譯器或中央處理器會產生 OOTA 值,標準原則上也禁止它們,但一條完全令人滿意的形式規則一直難以捉摸。對實作中的程式設計師而言,結論更簡單:依靠你「確實擁有」的修改順序保證,別去發明 relaxed 從未承諾過的跨變數排序。

atomic_int v;多個執行緒以 relaxed 依序存入 1、再 2、再 3。 任何讀 v 的執行緒都絕不會看到序列 ...,3,...,2,...——一旦它讀到 3,就再也不會讀到 1 或 2;對每個讀者而言,v 自身的順序是固定且單調的。

即使是 relaxed 原子,也絕不讓單一位置的值倒退——這就是修改順序保證。

修改順序是「每個」原子物件各自的——它為「單一」位置的寫入排序,對不同原子之間的排序什麼也沒說;憑空值在精神上被禁止,卻仍是形式模型已知的粗糙邊角,而非真實硬體會產生的東西。

又称
mod orderper-object total order修改順序