2014-10-18 244 views
2

我正在使用C#,我需要知道是否有1個線程讀取,並且1個線程寫入是安全的,不使用任何揮發物或鎖。我只會讀/寫32位整數和布爾值。如果我有1個線程寫入和1個線程讀取int32,它是線程安全的嗎?

+0

作者是否需要知道當前值(如增量)?如果是這樣,絕對不是。 – Mephy 2014-10-18 04:16:54

+0

我認爲在技術上它不是線程安全的,因爲理論上某些體系結構上的編譯器可以使用單獨的指令讀取/寫入該int的四個字節中的每一個字節,在這種情況下,可以僅在兩個字節已被處理。但實際上,我認爲讀寫32位值(或64位體系結構中的64位)是原子性的,因此是線程安全的。 – 2014-10-18 04:28:46

回答

2

這幾乎是線程不安全的代碼的定義。如果你分析了線程代碼中的需求,那麼你總是精確地尋找這種模式。如果不鎖定,那麼讀取的線程將觀察對該變量的隨機更改,完全與執行不同步並且完全隨機時間。

你從C#內存模型得到的唯一保證就是一個INT布爾更新原子。一個昂貴的詞,這意味着你不會意外地讀取值中的一些字節具有新值並且一些具有舊值的值。這會產生一個完全隨機的數字。並非每個值更新都是原子的,,和結構類型(包括可空<>和十進制)不是原子的。

在必要時不鎖定會產生非常難以調試的問題。它們取決於時間點,並且程序傾向於解決時序變化不大的執行模式。但是,例如,當機器被另一個任務佔用時突然改變。你的程序可以正常運行一週,然後當你收到一封電子郵件時失敗一次:)這是不可篡改的。

相關問題