gpt4 book ai didi

multithreading - .NET 4.5 中的内存模型发生了什么变化?

转载 作者:行者123 更新时间:2023-12-04 21:19:39 25 4
gpt4 key购买 nike

我刚刚在 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 的书 CLR via C# edition 1 和 2(我没有读过 3d)中讨论的那个)在 .NET 4.5 中改变了吗?

有没有自觉解释的文章?

最佳答案

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

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

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

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

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

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

关于multithreading - .NET 4.5 中的内存模型发生了什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14921043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com