[英]Read a non-atomic variable, atomically?
我有一個非原子的62位double,它在一個線程中定期增加。 此訪問不必是原子的。 但是,此變量有時會被另一個線程讀取(而不是寫入)。 如果我將變量對准64位邊界,則讀取是原子的。
但是,有什么方法可以確保增量過程中不會讀取變量? 我可以調用一個CPU指令來對管道進行序列化嗎? 記憶障礙?
我想到了在我的關鍵線程中聲明變量atomic並使用std::memory_order::memory_order_relaxed
(在稀有線程中使用更嚴格的內存屏障),但它似乎同樣昂貴。
由於標記了x86,因此它將是x86特定的。
增量本質上是三個部分,即讀取,添加,寫入。 增量不是原子的,但是所有三個步驟(我想這個加法都不算,無論如何它是不可觀察的),只要變量不跨越緩存行邊界(此條件比必須對齊要弱)保持自然對齊,直到P6必須對齊為止。
因此,您已經無法讀取殘缺的值。 您可能做的最壞的事情是在讀取變量和寫入新值之間覆蓋該變量,但您只能讀取它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.