Dot-Net
讀取雙精度不是執行緒安全的嗎?
更新:我剛剛在Eric Lippert對另一個問題的回答中偶然發現了這一點(他引用了規範):
其他類型的讀取和寫入,包括 long、ulong、double 和 decimal,以及使用者定義的類型,不保證是原子的。
好的,所以閱讀 a不是
double原子的。這意味著該值可能會在讀取過程中被修改,對嗎?那麼如何以原子方式讀取一個值呢?double我注意到有一種價值
Interlocked.Read方法long。這對我來說很有意義,因為讀取 64 位值必須需要兩個步驟,因此就像所有其他非原子操作一樣受到競爭條件的影響。但是沒有
Interlocked.Read值double,即使System.Double是 64 位值。我在我的程序中看到了一些奇怪的行為,其中我的 GUI(
double在文本框中顯示 a 而double其他執行緒也經常更新它)大部分時間都顯示正確的值(在 200.0 附近),然後偶爾隨機顯示錯誤值(如 -0.08)。也許這是一個執行緒問題,或者可能是其他問題。但首先我想縮小可能性。那麼:閱讀
double執行緒安全嗎?
通常的方式:用鎖控制訪問。
正在閱讀雙執行緒安全嗎?
不,正如規範所說
其他類型的讀取和寫入,包括 long、ulong、double 和 decimal,以及使用者定義的類型,不保證是原子的。
繼續。
這意味著該值可能會在讀取過程中被修改,對嗎?
是的。
那麼如何以原子方式讀取雙精度值呢?
您對可變變數的每次訪問都進行了鎖定。
還有一個你沒有問的問題,但經常被問到作為你問題的後續問題:
使欄位“易失”是否會使讀取/寫入它成為原子的?
不可以。將 volatile 欄位設置為 double 類型是不合法的。