從MSDN的Int64(長)和線程安全
引述分配這種類型的一個實例不是線程所有硬件平臺上安全的,因爲該實例的二進制表示可能過大,在一個單一的分配原子操作。
這是否意味着像Indaium或x86-64這樣的64位處理器上的Thead-safe?
例如:
long data = GetData();
// some parallel task on data
可能是一個問題?
從MSDN的Int64(長)和線程安全
引述分配這種類型的一個實例不是線程所有硬件平臺上安全的,因爲該實例的二進制表示可能過大,在一個單一的分配原子操作。
這是否意味着像Indaium或x86-64這樣的64位處理器上的Thead-safe?
例如:
long data = GetData();
// some parallel task on data
可能是一個問題?
可能,但爲什麼你會寫一個程序在一些Intel工作平臺上是線程安全的,而不是其他的?請注意,Decimal
和Double
類型也有關於線程安全性的免責聲明。
Microsoft建議在這些情況下使用鎖。有鏈接到有關併發,內存映射和低級別的鎖在這裏的一些好的信息:
如果您的data
變量直接由不同線程的代碼訪問,則會出現問題。
他們沒有對任何特定的系統做出保證,所以爲了安全起見,我假設它在x64系統和x86上都不是線程安全的,儘管我懷疑他們真正想要的是像緊湊框架運行的地方在智能手機上。
但int32沒有這個筆記它必須是相關架構(x64 x86) – 2010-08-02 03:03:16
我寧可在安全方面,並假設沒有。
注意this上一個問題。本質上,對於Int64s的原子分配,你應該看看使用Interlocked類。
退房this link也作一些更詳細的分析。具體來說,請查看標註爲「原子性和互鎖性」的部分。
問題的關鍵在於Int64
不是保證是原子性的,但並不排除它在某些情況下如此。換句話說,Int64
在64位系統上是原子的。當然,這並不意味着它必然是線程安全的。除了原子性之外,還有關於線程安全的其他問題。爲了防範過時的問題,例如,你必須使用適當的內存屏障指令(volatile
,Thread.VolatileWrite
等)
內存加載/存儲操作被認爲是原子的,如果他們是在內存塊執行的放置在對齊的內存地址上,並且不大於本地機器大小的指針。
這意味着,在一個64位平臺上,在一個對齊的內存地址上的64位加載/存儲操作將是原子性的,但它在32位平臺上不會是原子性的。
現代處理器提供了一組特殊的指令(在.Net中,大多數指令都是通過Interlocked
類別公開的)。它允許在大於機器本地指針大小(32位處理器上的64位操作,以及64位處理器上的128位操作)上實現加載/存儲操作的原子性。後者沒有被Interlocked
類暴露,但是以本地代碼提供)。
欲瞭解更多詳情,請檢查Joe Duffy的帖子:Thread-safety, torn reads, and the like。
另請參閱http://stackoverflow.com/questions/596065/under-c-is-int64-use-on-a-32-bit-processor-dangerous – 2010-08-02 03:03:10