簡體   English   中英

修改和讀取原子變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM