2013-02-17 5 views
5

Ich habe gerade gelesen diese rätselhafte Linie in Peter Richtie Blog und ich brauche Hilfe, um die Bedeutung Prior to .NET 4.5 you really programmed to the .NET memory model zu verstehen: http://msmvps.com/blogs/peterritchie/archive/2012/09/09/thread-synchronization-of-atomic-invariants-in-net-4-5.aspxWas hat sich im Speichermodell in .NET 4.5 geändert?

Hat das ‚übliche‘ .NET-Speichermodell(wie das in Jeffrey Richter Buch CLR diskutiert via C# edition 1 und 2 (ich habe 3d nicht gelesen)) in .NET 4.5 geändert?

Gibt es einen Artikel mit bewusster Erklärung?

Antwort

2

Der richtige Umgang mit Gleichzeitigkeit in .NET basiert auf einem schwachen Speichermodell. Dies hat sich in .NET 4.5 nicht geändert.

Nur weil Itanium nicht mehr unterstützt wird, bedeutet das nicht, dass Sie die stärkeren x86- oder AMD64-Speichermodelle annehmen können. Zum Beispiel haben Sie andere schwache Speichermodell-Plattformen wie ARM.

Denken Sie immer daran, dass nichtflüchtige Lesevorgänge in dieselbe Variable oder dasselbe Feld nach dem ersten vom JIT-Compiler gelöscht werden können, falls es keine Synchronisation zwischen Lesevorgängen (Speicherbarrieren, Monitorsperre eines Objekts) gibt ist/war Monitor entsperrt, flüchtiges Lesen einer Variablen, die flüchtig geschrieben wurde, Interlocked Operationen an einer Variablen). Dies berücksichtigt die Konsistenz des Threads.

Der Artikel, mit dem Sie verknüpft sind, zeigt Beispiele, in denen der Microsoft .NET Framework-JIT-Compiler elides z. while Schleifen, die eine nichtflüchtige Variable ohne Synchronisationspunkt in der Schleife lesen. Aber denken Sie daran, ein JIT-Compiler könnte ganze Programmoptimierungen verwenden, um diese Elision zwischen Callern und Calles zu verallgemeinern.

Als solche Lock-Free-Algorithmen in .NET, die eine Variable oder ein Feld ohne Speicherbarrieren, Schlösser, flüchtige Semantik oder Interlocked Operationen zu lesen, auf der Prämisse, dass diese liest, wird schließlich von anderen Threads Änderungen sieht, sind Glücksspiele mit der JIT-Compiler. Im Wesentlichen sind diese Algorithmen hinsichtlich der Portabilität falsch.

Was mich wundern lässt, warum fragst du das?

+0

wir leben in verschiedenen Universen. es zahlt sich aus, hier zu wissen .. vielleicht lohnt es sich, portable Anwendungen in .NET in Ihrem Universum zu schreiben .. Ich bin nicht damit beschäftigt .. bist du? –

+0

Ich erwarte, dass einige meiner .NET-Bibliotheken (die von verschiedenen Zielen gemeinsam genutzt werden) in 32-Bit- und 64-Bit- sowie in starken Speichermodellen und schwachen Speichermodellen ordnungsgemäß funktionieren. Ich erwäge nicht einmal Portabilität außerhalb der Microsoft-Plattformen. Einige der derzeit beliebtesten NuGet-Pakete (Json.NET, NLog) funktionieren beispielsweise in Windows Server 2012 R2 (amd64) und Windows Phone 8.1 oder Windows 10 Mobile (möglicherweise ARM). Was ist, wenn die Autoren sich nicht um Portabilität kümmern? Es ist nicht so schwer, Gleichzeitigkeit richtig zu machen, was schwierig ist, ist z.B. um Code zu optimieren, um Sperrkonflikte zu vermeiden, usw. – acelent

+0

Ich verstehe, dass Sie aus Ihrer Sicht in den sauren Apfel beißen können. Persönlich bevorzuge ich Code, der für das schwächere Gedächtnismodell bereit ist. Zum Beispiel beginne ich mit Sperren, um zu einer korrekten Implementierung zu gelangen, und iteriere dann zu flüchtigen Feldern und/oder "verriegelten" Operationen. Wenn Sie beschließen, mit ungeschützten Lesevorgängen zu gehen, tun Sie zumindest wissentlich, dass "es auf Ihren Maschinen funktioniert". – acelent

Verwandte Themen