Das Speichermodell ist spezifisch für die Laufzeit, daher lautet Ihre Frage tatsächlich "Gibt es Unterschiede in den Speichermodellen von CLR, CoreCLR und MonoRuntime?".
Nach ein wenig Recherche ist die Frage wirklich sehr, sehr schwer zu beantworten. Es gibt die von Ihnen erwähnte ECMA-Spezifikation , die Ihnen die Mindestgarantien bietet, die alle Implementierungen bieten müssen. Es gibt eine sehr schöne, prägnante Beschreibung in Joe Duffys Blog für CLR 2.0. Für .NET Framework gibt es diesen zweiteiligen Artikel , in dem das CLR-Modell wahrscheinlich ausführlicher behandelt wird, als es zu wissen ist. Es gibt sogar ein Papier darüber geschrieben.
Für MonoRuntime habe ich dieses Dokument gefunden , das sich mit Atomics befasst und tatsächlich beschreibt, wie Mono dies implementiert, obwohl der Detaillierungsgrad eher gering ist.
Noch schwieriger ist es, Details zu CoreCLR zu finden. Es gibt einige Schlüsselpunkte in diesem hervorgehoben Dotnet / CoreCLR GitHub Faden und eine Diskussion über flüchtige Lese / Schreibvorgänge in diesem einen .
Der einfachste Weg zu antworten ist - ja, es hat sich basierend auf den oben genannten Ressourcen geändert.
Es gibt jedoch eine zweite Möglichkeit, Ihre Frage zu beantworten, und zwar einfach, ihre Prämisse zu leugnen - es scheint anzunehmen, dass sich das Speichermodell in dem Sinne geändert hat, dass sich einige kluge Leute hinsetzten, die ECMA-CLI-Spezifikation umschrieben und dies in die CoreCLR machten Speichermodellspezifikation und das ist das neue Speichermodell. Das ist nicht der Fall. Die genannten intelligenten Leute setzten sich und verfeinerten das Design im Laufe vieler Monate so, dass es zuverlässig, schnell, vernünftig einfach zu implementieren und nicht gegen die Mindestgarantien der Spezifikation verstößt. Zitiert aus dem verlinkten Blog von Joe Duffy:
Wir haben unser Modell über Jahre informeller Arbeit und beispielhafter Gestaltung (...) konstruiert. Dies kann sich von einer Implementierung zur nächsten ändern.
Die informelle ECMA-Spezifikation ist leider so formal, wie wir es derzeit bekommen. Es gibt weder eine formale Beschreibung von Änderungen zwischen der ECMA-Spezifikation und der CLR-Implementierung noch eine formale Beschreibung von Änderungen zwischen CLR und CoreCLR. Und was noch wichtiger ist: Die implementierungsspezifischen Unterschiede zwischen der ECMA-CLI und der CLR / CoreCLR sind genau das - implementierungsspezifisch - und dürfen nicht als verlässlich angesehen werden . Die einzige 100% zuverlässige Quelle für die Implementierung des .NET Core-Speichermodells ist der Quellcode. Und das ändert sich offensichtlich mit jedem Commit, jeder Veröffentlichung, und es gibt keine Garantie dafür, dass das Team nicht den gesamten Jitter aus dem Fenster wirft und ihn neu schreibt, damit .NET 5 genau der ECMA-Spezifikation entspricht (wie unwahrscheinlich dies auch sein mag) ).