C# 在.NET内核中实现了什么内存模型?

C# 在.NET内核中实现了什么内存模型?,c#,.net-core,C#,.net Core,ECMA CLI规范定义了弱内存模型。这允许对命令执行顺序进行重新排序(这对性能非常有用)。但是为这样的模型编写低级代码是非常困难的 最重要的是,X86/AMD64处理器体系结构具有更严格(强大)的内存模型。因此,Microsoft在其CLR实现中实现了比规范中描述的更强大的内存模型 在.NET Core中的内存模型是否已更改?此框架可能会在内存模型比X86/AMD64弱的体系结构上运行 此外,.NETCore还集成了Mono和其他。据我所知,单存储器模型较弱,对应于ECMA 在这篇文章中写道:

ECMA CLI规范定义了弱内存模型。这允许对命令执行顺序进行重新排序(这对性能非常有用)。但是为这样的模型编写低级代码是非常困难的

最重要的是,X86/AMD64处理器体系结构具有更严格(强大)的内存模型。因此,Microsoft在其CLR实现中实现了比规范中描述的更强大的内存模型

在.NET Core中的内存模型是否已更改?此框架可能会在内存模型比X86/AMD64弱的体系结构上运行


此外,.NETCore还集成了Mono和其他。据我所知,单存储器模型较弱,对应于ECMA

在这篇文章中写道:

通过充分利用.NET核心、.NET框架、Xamarin和Mono,扩展.NET的功能

因此,我认为,如果不是现在,那么在未来,这些运行时将合并为一个整体。
文章如下:

我们正在制作CoreCLR和Mono drop-in的替代品。我们将使它像构建开关一样简单,可以在不同的运行时选项之间进行选择

如果我理解正确,将有两个(或更多)运行时。也许每个人都有自己的记忆模式


我们谈论的是什么:。

内存模型是特定于运行时的,因此您的问题实际上是“CLR、CoreCLR和MonoRuntime的内存模型是否存在任何差异”

经过研究,我发现这个问题真的很难回答。正如您所提到的,它为您提供了所有实现必须提供的最低限度的保证。关于CLR 2.0,有一个非常好、简洁的描述。然后,对于.NETFramework来说,有一个关于CLR模型的描述可能比它所知道的更详细。上面甚至写着

对于MonoRuntime,我发现它讨论了原子,并实际描述了Mono实现这一点的方式,尽管详细程度相当低

找到CoreCLR的细节更为棘手。本文和关于易失性读/写的讨论突出了一些要点

最简单的回答是——是的,基于上述资源,它已经改变了

然而,还有第二种方法可以回答你的问题,那就是简单地否认它的前提——它似乎假设内存模型发生了变化,因为一些聪明人坐下来,重写了ECMA CLI规范,将其写入了CoreCLR内存模型规范,这就是新的内存模型。事实并非如此。提到的聪明人坐下来,在几个月的过程中,改进了设计,使其可靠、快速、易于实施,并且不违反规范的最低保证。引用链接Joe Duffy的博客:

我们通过多年的非正式工作和示例设计构建了我们的模型(…),这很容易从一个实现更改到下一个实现


不幸的是,非正式的ECMA规范与我们现在得到的一样正式。ECMA规范和CLR实现之间的变更没有正式描述,CLR和CORECRL之间的变更也没有正式描述。而且,更重要的是,ECMA CLI和CLR/CoreCLR之间的特定于实现的差异只是特定于实现,不能依赖于它。关于.NET核心内存模型是如何实现的,唯一100%可靠的来源是源代码。每一次提交、每一次发布都会发生明显的变化,而且不能保证团队不会将整个抖动抛到窗外,并将.NET 5的抖动重写为与ECMA规范完全相同的抖动(无论这种可能性有多大)。

。底线:CoreCLR并不认为自己会被迫复制X86上CLR的更强有力的保证(这在ARM上是不切实际的)。(同时,没有任何动机可以随意偏离x86上当前的x86机型。)“.NETCore包含Mono和其他”需要链接参考。我不相信这是真的,因为.NET核心CLR和Mono CLR仍然是分开的。@LexLi-updated。添加了链接。@Alexander Petrov该链接与.NET 5有关,即将于2020年发布。NetCore和Mono仍然是不同的平台。