3 回答

TA貢獻1829條經驗 獲得超4個贊
我相信,如果每個線程僅在數組的單獨部分上工作,那么一切都會很好。如果您要共享數據(即在線程之間通信),則將需要某種內存屏障來避免內存模型問題。
我相信,如果您生成一堆線程,每個線程都填充其自己的數組部分,然后等待所有這些線程完成使用Thread.Join
,那么就屏障而言,這足以確保您的安全。目前,我沒有任何支持文檔,請注意...
編輯:您的示例代碼是安全的。兩個線程在任何時候都不會訪問同一元素-好像它們每個都有單獨的變量一樣。但是,這本身并不太有用。通常,在某個時候,線程將要共享狀態-一個線程將要讀取另一線程已寫的內容。否則,將它們寫入共享數組而不是自己的私有變量是沒有意義的。那是您需要小心的地方-線程之間的協調。

TA貢獻1853條經驗 獲得超9個贊
陣列上的MSDN文檔說:
此類型的公共靜態(在Visual Basic中為Shared)成員是線程安全的。不保證任何實例成員都是線程安全的。
此實現未為Array提供同步的(線程安全的)包裝器;但是,基于Array的.NET Framework類使用SyncRoot屬性提供了它們自己的集合的同步版本。
通過集合進行枚舉本質上不是線程安全的過程。即使同步了一個集合,其他線程仍然可以修改該集合,這將導致枚舉器引發異常。為了保證枚舉期間的線程安全,您可以在整個枚舉期間鎖定集合,也可以捕獲由其他線程進行的更改導致的異常。
因此,它們不是線程安全的。

TA貢獻1906條經驗 獲得超3個贊
通常,當一個集合被稱為“不是線程安全的”時,這意味著并發訪問可能會在內部失敗(例如,讀取List <T>的第一個元素并不安全,而另一個線程在列表的末尾添加一個元素:List <T>可能會調整基礎數組的大小,并且在將數據復制到新數組之前,讀取訪問權可能會轉到新數組。
對于數組,這種錯誤是不可能的,因為數組是固定大小的,并且沒有這種“結構更改”。具有三個元素的數組與三個變量的線程安全性差不多。
C#規范對此沒有說明。但是很清楚,如果您了解IL并閱讀了CLI規范-您可以獲取對數組內元素的托管引用(例如用于C#“ ref”參數的引用),然后進行常規和易失性加載并存儲到該元素。CLI規范描述了此類加載和存儲的線程安全保證(例如,元素<= 32位的原子性)
因此,如果我正確地理解了您的問題,您想使用不同的線程來填充數組,但是將僅分配給每個數組元素一次?如果是這樣,那絕對是線程安全的。
- 3 回答
- 0 關注
- 1124 瀏覽
添加回答
舉報