2013-02-17 53 views
5

我剛纔讀彼得Richtie博客這個令人費解的線,我需要幫助來理解其中的含義Prior to .NET 4.5 you really programmed to the .NET memory modelhttp://msmvps.com/blogs/peterritchie/archive/2012/09/09/thread-synchronization-of-atomic-invariants-in-net-4-5.aspx.NET 4.5中的內存模型發生了什麼變化?

有「平常」 .NET的內存模型(如傑弗裏裏希特書CLR討論的一個通過C#版本1和2(我沒有閱讀3d))在.NET 4.5中更改?

是否有意識的解釋?

回答

2

在.NET中處理併發的正確方法是基於弱內存模型。這在.NET 4.5中沒有改變。

僅因爲不再支持Itanium並不意味着您可以採用更強大的x86或amd64內存模型。例如,你有其他弱內存模型平臺,比如ARM。

一定要記住,對於同一個變量或字段的非易失性讀取可能會在JIT編譯器的第一個之後被刪除,以防它能證明讀取之間沒有同步(內存屏障,監視對象的鎖定是/被監視器解鎖,易失性變量的易失性讀取,變量上的Interlocked操作)。這尊重線程的觀點一致性。

您鏈接到的文章顯示了Microsoft .NET Framework的JIT編譯器隱藏的例子,例如, while循環讀取循環內沒有任何同步點的非易失性變量。但請記住,JIT編譯器可以使用整個程序優化來在呼叫者和被呼叫者之間概括這個精華。因此,.NET中的無鎖算法在讀取變量或字段時沒有內存障礙,鎖定,易失性語義或操作,前提是這些讀取最終會看到來自其他線程的更改,這些算法都是與JIT編譯器。實質上,這些算法在可移植性方面是錯誤的。

這讓我想知道,你爲什麼這麼問?

+0

我們生活在不同的宇宙中。在這裏知道它是值得的..也許在.NET中編寫可移植的應用程序是值得的。我不會爲此煩惱。是嗎? – 2016-11-23 14:11:18

+0

我希望我的一些.NET庫(在不同的目標間共享)能夠在32位和64位以及強內存模型和弱內存模型中正常工作。我甚至沒有考慮微軟平臺以外的可移植性。例如,目前最流行的一些NuGet軟件包(Json.NET,NLog)可以在Windows Server 2012 R2(amd64)和Windows Phone 8.1或Windows 10 Mobile(可能是ARM)上運行。如果作者不關心可移植性怎麼辦?要獲得併發性並不難,例如很難優化,重構代碼以避免鎖爭用等。 – acelent 2016-11-23 15:08:57

+0

我明白,從您的角度來看,您可能會咬緊牙關。就個人而言,我更願意爲較弱的內存模型準備好代碼。例如,我開始使用鎖來獲得正確的實現,然後遍歷易失性字段和/或「互鎖」操作。如果你決定使用無保留的閱讀方式,至少應該明知是「它在你的機器上運行」。 – acelent 2016-11-23 15:10:24

相關問題