5

我刚刚在 Peter 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 内存模型(例如 Jeffrey Richter 的书 CLR via C# 第 1 版和第 2 版(我没有读过 3d)中讨论的那个)是否发生了变化?

有没有有意识解释的文章?

4

1 回答 1

2

在 .NET 中处理并发的正确方法是基于弱内存模型。这在 .NET 4.5 中没有改变。

仅仅因为不再支持 Itanium 并不意味着您可以假设更强大的 x86 或 amd64 内存模型。例如,您有其他弱内存模型平台,例如 ARM。

永远记住,JIT 编译器可能会在第一次之后忽略对同一变量或字段的非易失性读取,以防它可以证明读取之间没有同步(内存屏障,监控对象的锁定是/曾经是监控器)未锁定、易失性读取易失性写入的变量、Interlocked对变量进行操作)。这尊重线程的观点一致性。

您链接到的文章显示了 Microsoft .NET Framework 的 JIT 编译器忽略读取的示例,例如while读取非易失性变量的循环,而循环内没有任何同步点。但请记住,JIT 编译器可以使用整个程序优化来概括调用者和被调用者之间的这种省略。

因此,.NET 中的无锁算法在没有内存屏障、锁、易失性语义或Interlocked操作的情况下读取变量或字段,前提是这些读取最终会看到来自其他线程的更改,这是在与 JIT 编译器赌博。从本质上讲,这些算法在可移植性方面是错误的。

这让我想知道,你为什么要问这个?

于 2016-11-23T13:37:06.630 回答