memory_order_relaxed
呼叫者指定無任何記憶體次序請求,從而使編譯器可以自由地改變操作的順序。memory_order_release
指定在當前執行緒 T1 中對一個原子物件A進行寫存取時執行釋放操作(release operation)。釋放操作的作用是:當另一個執行緒 T2 對 A 執行捕獲操作時(讀存取),所有 T1 曾對 A 執行的操作在 T2 捕獲 A 以後,對 T2 都是可見的。memory_order_acquire
指定對一個原子物件進行讀存取時執行捕獲操作(acquire operation)。它確保在該函數呼叫前,後續的記憶體存取操作不發生重新排列。memory_order_consume
一個消耗操作(consume operation)的限制小於一個捕獲操作:它僅當後續記憶體存取操作直接依賴讀取原子變數時,防止重新排序。memory_order_acq_rel
同時具有捕獲和釋放操作。memory_order_seq_cst
順序一致性(sequential consistency)請求包括對 memory_order_acq_rel 的捕獲和釋放操作。此外,它還指定了所有操作按一個次序嚴格執行,該次序為所包含原子物件的修改次序。順序一致性是預設的記憶體順序請求,如果沒有顯式指定更低的請求,這種請求會應用到所有原子操作。++counter; // 隱含memory_order_seq_cst
atomic_fetch_add_explicit( &counter, 1, memory_order_relaxed );
struct Data *dp = NULL, data; atomic_intptr_t aptr = ATOMIC_VAR_INIT(0); // 執行緒1 data = ...; // 操作A atomic_store_explicit( &aptr, (intptr_t)&data, memory_order_release ); // 執行緒2 dp = (struct Data*)atomic_load_explicit( &aptr, memory_order_acquire ); if( dp != NULL) // 處理*dp所參照的資料 // 操作B else // *dp所參照的資料還不可獲得
void atomic_thread_fence(memory_order order);
// 執行緒2 dp = (struct Data*)atomic_load_explicit( &aptr, memory_order_relaxed ); if( dp != NULL) { atomic_thread_fence(memory_order_acquire); // 操作B:處理*dp所參照的資料 } else // *dp所參照的資料還不可獲得