我刚刚在Peter Richtie博客中阅读了这个令人费解的内容,我需要帮助来理解Prior to .NET 4.5 you really programmed to the .NET memory model
的含义:http://msmvps.com/blogs/peterritchie/archive/2012/09/09/thread-synchronization-of-atomic-invariants-in-net-4-5.aspx
具有'通常'的.NET内存模型 (例如Jeffrey Richter在C#第1版和第2版中讨论过的那本书(我还没读过3d) ))在.NET 4.5中更改了吗?
是否有一篇有意识解释的文章?
答案 0 :(得分:2)
在.NET中处理并发的正确方法是基于弱内存模型。这在.NET 4.5中没有改变。
仅仅因为不再支持Itanium并不意味着您可以采用更强大的x86或amd64内存模型。例如,您有其他弱内存模型平台,例如ARM。
永远记住,JIT编译器可以在第一个变量或字段之后省略对同一变量或字段的非易失性读取,以防它可以证明读取之间没有同步(内存屏障,监视对象的锁定) /是监视器解锁,易失性读取变量的易失性写入,Interlocked
对变量的操作)。这尊重了线程的一致性。
您链接的文章显示了Microsoft .NET Framework的JIT编译器读取的示例,例如while
循环读取非易失性变量,循环内没有任何同步点。但请记住,JIT编译器可以使用整个程序优化来概括调用者和被调用者之间的这种省略。
因此,.NET中的无锁算法在没有内存障碍,锁,易失性语义或Interlocked
操作的情况下读取变量或字段,前提是这些读取最终会看到来自其他线程的更改,使用JIT编译器进行赌博。从本质上讲,这些算法在可移植性方面是错误的。
这让我很奇怪,你为什么这么问?