我想知道如果我需要在下列情況下使用std::atomic
:C++ 11:確保寫入一次讀取的定義語義?
- 一個(指針)成員變量在對象的構造
- 在未來的某個時刻初始化,有正好一個寫一些螺紋
- 幾個其他線程正在讀它(讀取前後寫發生)
,如果我只是在尋找FOLL一致性由於類型:
- 一個線程看到任一成員變量的初始值或在寫操作之後的值
- 每個線程最終看到寫操作之後的值(提供它運行足夠長的時間)
如果是,我應該在加載/存儲中使用哪個內存順序(在memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst
之外)以獲得儘可能少的開銷?
舉個例子,假設我想實現一個「靜態」單向鏈表只能插在尾部和從不刪除或更改任何下一個指針,即:
Entry {
...
const Entry* next; // or std::atomic<const Entry*> next;
Entry() : next(NULL) { ... }
...
};
void Insert(Entry* tail, const Entry* e) {
tail->next = e; // assuming tail != NULL (i.e. we always have a dummy node)
}