Dot-Net

讀取雙精度不是執行緒安全的嗎?

  • April 9, 2015

更新:我剛剛在Eric Lippert另一個問題的回答中偶然發現了這一點(他引用了規範):

其他類型的讀取和寫入,包括 long、ulong、double 和 decimal,以及使用者定義的類型,不保證是原子的。

好的,所以閱讀 a不是double原子的。這意味著該值可能會在讀取過程中被修改,對嗎?那麼如何以原子方式讀取一個值呢?double


我注意到有一種價值Interlocked.Read方法long。這對我來說很有意義,因為讀取 64 位值必須需要兩個步驟,因此就像所有其他非原子操作一樣受到競爭條件的影響。

但是沒有Interlocked.Readdouble,即使System.Double是 64 位值。

我在我的程序中看到了一些奇怪的行為,其中我的 GUI(double在文本框中顯示 a 而double其他執行緒也經常更新它)大部分時間都顯示正確的值(在 200.0 附近),然後偶爾隨機顯示錯誤值(如 -0.08)。

也許這是一個執行緒問題,或者可能是其他問題。但首先我想縮小可能性。那麼:閱讀double執行緒安全嗎?

通常的方式:用鎖控制訪問。

正在閱讀雙執行緒安全嗎?

不,正如規範所說

其他類型的讀取和寫入,包括 long、ulong、double 和 decimal,以及使用者定義的類型,不保證是原子的。

繼續。

這意味著該值可能會在讀取過程中被修改,對嗎?

是的。

那麼如何以原子方式讀取雙精度值呢?

您對可變變數的每次訪問都進行了鎖定。

還有一個你沒有問的問題,但經常被問到作為你問題的後續問題:

使欄位“易失”是否會使讀取/寫入它成為原子的?

不可以。將 volatile 欄位設置為 double 類型是不合法的。

引用自:https://stackoverflow.com/questions/3676808