簡體   English   中英

原子地讀取非原子變量?

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

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