enum
<atomic>

std::memory_order

enum memory_order;
記憶體順序
用作執行*原子操作*的函式的引數,以指定其他執行緒上的其他操作如何同步。

它被定義為
1
2
3
4
5
6
7
8
typedef enum memory_order {
    memory_order_relaxed,   // relaxed
    memory_order_consume,   // consume
    memory_order_acquire,   // acquire
    memory_order_release,   // release
    memory_order_acq_rel,   // acquire/release
    memory_order_seq_cst    // sequentially consistent
} memory_order;

當多個執行緒訪問一個*原子物件*時,所有*原子操作*都會在其中產生*明確定義的*行為:每個原子操作在其他任何原子操作可以訪問它之前,都會在物件上完全執行。這保證了這些物件上沒有資料競爭,而這正是*原子性*的定義特徵。

但是,每個執行緒可能還會對原子物件本身以外的記憶體位置執行操作:而這些其他操作可能會在其他執行緒上產生*可見的副作用*。此型別的引數允許為操作指定一個*記憶體順序*,該順序決定了這些(可能的非原子)*可見副作用*如何線上程之間同步,使用*原子操作*作為同步點。

memory_order_relaxed
該操作被排序為在某個時間點原子地發生。
這是最寬鬆的*記憶體順序*,對不同執行緒中的記憶體訪問如何與原子操作排序沒有提供任何保證。
memory_order_consume
[適用於*載入操作*]
該操作被排序為在*釋放執行緒*中攜帶對*釋放操作*依賴的所有記憶體訪問(並在*載入執行緒*上具有可見的副作用)發生之後發生。
memory_order_acquire
[適用於*載入操作*]
該操作被排序為在*釋放執行緒*中的所有記憶體訪問(在*載入執行緒*上具有可見的副作用)發生之後發生。
memory_order_release
[適用於*儲存操作*]
該操作被排序為發生在*consume*或*acquire*操作之前,作為其他可能在*載入執行緒*上具有可見副作用的記憶體訪問的同步點。
memory_order_acq_rel
[適用於*載入/儲存操作*]
該操作執行*獲取*並執行*釋放*(如上對memory_order_acquirememory_order_release的定義)。
memory_order_seq_cst
該操作以*順序一致*的方式進行排序:所有使用此*記憶體順序*的操作都將被排序為在可能對其他涉及執行緒產生可見副作用的所有記憶體訪問發生之後發生。
這是最嚴格的*記憶體順序*,可保證執行緒互動之間最少的意外副作用,儘管是非原子記憶體訪問。
對於*consume*和*acquire*載入,*順序一致*的儲存操作被視為*釋放*操作。