2010-08-02 44 views
5

從MSDN的Int64(長)和線程安全

引述分配這種類型的一個實例不是線程所有硬件平臺上安全的,因爲該實例的二進制表示可能過大,在一個單一的分配原子操作。

這是否意味着像Indaium或x86-64這樣的64位處理器上的Thead-safe?

例如:

long data = GetData(); 
// some parallel task on data 

可能是一個問題?

+0

另請參閱http://stackoverflow.com/questions/596065/under-c-is-int64-use-on-a-32-bit-processor-dangerous – 2010-08-02 03:03:10

回答

0

如果您的data變量直接由不同線程的代碼訪問,則會出現問題。

他們沒有對任何特定的系統做出保證,所以爲了安全起見,我假設它在x64系統和x86上都不是線程安全的,儘管我懷疑他們真正想要的是像緊湊框架運行的地方在智能手機上。

+0

但int32沒有這個筆記它必須是相關架構(x64 x86) – 2010-08-02 03:03:16

0

我寧可在安全方面,並假設沒有。

注意this上一個問題。本質上,對於Int64s的原子分配,你應該看看使用Interlocked類。

退房this link也作一些更詳細的分析。具體來說,請查看標註爲「原子性和互鎖性」的部分。

0

問題的關鍵在於Int64不是保證是原子性的,但並不排除它在某些情況下如此。換句話說,Int64在64位系統上是原子的。當然,這並不意味着它必然是線程安全的。除了原子性之外,還有關於線程安全的其他問題。爲了防範過時的問題,例如,你必須使用適當的內存屏障指令(volatileThread.VolatileWrite等)

1

內存加載/存儲操作被認爲是原子的,如果他們是在內存塊執行的放置在對齊的內存地址上,並且不大於本地機器大小的指針。
這意味着,在一個64位平臺上,在一個對齊的內存地址上的64位加載/存儲操作將是原子性的,但它在32位平臺上不會是原子性的。

現代處理器提供了一組特殊的指令(在.Net中,大多數指令都是通過Interlocked類別公開的)。它允許在大於機器本地指針大小(32位處理器上的64位操作,以及64位處理器上的128位操作)上實現加載/存儲操作的原子性。後者沒有被Interlocked類暴露,但是以本地代碼提供)。

欲瞭解更多詳情,請檢查Joe Duffy的帖子:Thread-safety, torn reads, and the like

+0

友情提醒:http://www.bluebytesoftware.com/blog/CommentView,guid,c40a187f-4eeb-43c9-8532-35d480abd1e1.aspx是一個死鏈接 – Rick 2017-09-27 14:11:29

+0

我找到了生活鏈接http: //joeduffyblog.com/2006/02/07/threadsafety-torn-reads-and-the-like/ – Rick 2017-09-27 15:57:42