Bop*_*Bop 5 multithreading shared-memory .net-4.5
我刚刚在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 4.5中,"通常的".NET内存模型(例如在Jeffrey Richter书中通过C#第1版和第2版(我还没有阅读过3d)中讨论过的那种模型)是否已更改?
是否有一篇有意识解释的文章?
在 .NET 中处理并发的正确方法是基于弱内存模型。这在 .NET 4.5 中没有改变。
仅仅因为 Itanium 不再受支持并不意味着您可以采用更强大的 x86 或 amd64 内存模型。例如,您有其他弱内存模型平台,例如 ARM。
始终记住,JIT 编译器可能会在第一次读取之后删除对同一变量或字段的非易失性读取,以防它可以证明读取之间不存在同步(内存屏障、当前/曾经监视的对象的监视锁)未锁定、对易失性写入的变量进行易失性读取、Interlocked对变量进行操作)。这尊重线程观点的一致性。
您链接到的文章显示了 Microsoft .NET Framework 的 JIT 编译器在循环中省略读取的示例,while这些循环读取非易失性变量,而循环内没有任何同步点。但请记住,JIT 编译器可以使用整个程序优化来概括调用者和被调用者之间的这种省略。
因此,.NET 中的无锁算法在没有内存屏障、锁、易失性语义或Interlocked操作的情况下读取变量或字段,前提是这些读取最终会看到来自其他线程的更改,这是在与 JIT 编译器进行赌博。本质上,这些算法在可移植性方面是错误的。
这让我想知道,你为什么问这个?