[英]Modify and read from an atomic variable
一個班級有以下成員,
std::atomic<int> clientId{0};
並在其成員函數中給出以下內容,
int currentId = ++clientId.load();
這里有比賽條件嗎? 我正在嘗試做類似的事情來生成clientId。 多個線程可以執行這部分代碼。 一個已經增加了clientId並且在嘗試加載()並獲取副本之前,另一個線程會增加相同值並因此導致競爭狀態的線程是否可以? 如果是,使用互斥對象進行保護是使用普通int並在互斥對象內部獲取副本的最佳方法嗎?
請解釋。
std::atomic<int>::load()
不返回引用,因此您不會遞增clientId
的當前值,而是遞增load()
返回的臨時值。
您需要做:
int currentId = ++clientId; // no .load()
std::atomic
有重載的運算符 。 預遞增運算符的內存順序為std:: memory_order_seq_cst
1 ,它表示:
以該內存順序執行的裝入操作執行獲取操作,存儲執行釋放操作,而讀-修改-寫操作同時執行獲取操作和釋放操作,此外還存在一個總順序,其中所有線程都觀察到線程中的所有修改。相同的順序(請參見下面的順序一致的順序)
因此,您在這里免受數據爭用情況的影響。
1該標准說++clientId
等效於fetch_add(1) + 1
,並且fetch_add
的默認內存順序為std::memory_order_seq_cst
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.