myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Was ist der Unterschied zwischen volatile und atomar?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Was ist der Unterschied zwischen volatile und atomar?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
myCSharp.de
Moderationshinweis von gfoidl (08.08.2020 10:02):

Abgeteilt von  Buch zu den .NET-Internas?
 
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

avatar-4140.png


Dabei seit: 03.02.2012
Beiträge: 1.373
Entwicklungsumgebung: Visual Studio Preview
Herkunft: NRW


Palladin007 ist offline

Was ist der Unterschied zwischen volatile und atomar?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das Thema kam auf, als ich nachgelesen habe, das Variablen-Zugriffe scheinbar nicht ganz so atomar sind, wie erst gedacht - aus dem Grund gibt's ja volatile.
Das wusste ich auch vorher schon (war mir nur nicht ganz sicher), aber weil ich das nochmal genauer nach gelesen habe, wurde mir klar, wie wenig ich eigentlich über die Runtime weiß.

Daher der Plan, dass ich mich genauer einlese, ohne dass es ein konkretes Problem/Projekt/Ziel gibt.
07.08.2020 15:21 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.689
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hat auch nicht viel mit der Runtime als mehr mit den spezfizierten Datentypen zu tun.
Die grundlegenden Datentypen wie int, double, float sind in den meisten Programmiersprachen nicht atomar bzw. muss man dafür über andere Typen wie AtomicInteger oder durch volatile dafür sorgen.

Dann geht dein Problem aber auch mehr in Richtung von üblichen Threading Poblemen, die nicht primär an .NET liegen sondern an den zu grunde liegenden Konzepten der Datentypen.

T-Virus

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am 07.08.2020 15:34.

07.08.2020 15:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.447
Herkunft: BW


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von T-Virus:
Hat auch nicht viel mit der Runtime als mehr mit den spezfizierten Datentypen zu tun.

Nein, im Fall von .NET hat das durchaus was mit der Runtime zutun. Aber das ist ja nun nicht Teil des Themas :-)
Bitte beim Buchthema bleiben, danke.

Von dem ich prinzipiell viel lerne im Sinne von .NET unter der Haube ist eben Stephen Toub.
Der ist auch recht aktiv in den .NET Blogs und Co.

 .NET PFX Team Blog
07.08.2020 16:34 Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.681
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

auch wenns in diesem (Unter-) Forum offtopic ist, sollte das nicht unkommentiert stehen bleiben, da es nicht richtig ist.

Sollte das weiterer Diskussion bedürfen, so können wir das auch abteilen.

Zitat:
Variablen-Zugriffe scheinbar nicht ganz so atomar sind, wie erst gedacht - aus dem Grund gibt's ja volatile.

Zitat:
Die grundlegenden Datentypen wie int, double, float sind in den meisten Programmiersprachen nicht atomar bzw. muss man dafür über andere Typen wie AtomicInteger oder durch volatile dafür sorgen.

volatile hat mit "atomar" nichts zu tun. Das sind zwei verschiedene Dinge -- beide haben ihren Ursprung zwar im "Threading", aber sind dennoch grundverschieden.

volatile ist ein Modifizierer für die Sichtbarkeit der Variable.

"atomar" heißt hier dass der Wert unteilbar (~ Atom) geschrieben / gelesen wird, ohne dass "torn writes / reads" zugelassen werden.
Typen deren Größe der Wortgröße der CPU entspricht werden immer atomar geschrieben / gelesen. sizeof(T) == Wortgröße <=> atomar.
D.h. bei x86 ist int, float atomar. Bei x64 ist double auch atomar.
Referenzen sind -- per Konstruktion -- ebenfalls immer atomar.
Größere Werttypen als Wortgröße der CPU brauchen besondere Behandlung, damit sie atomar verwendet werden können (z.B. durch Interlocked).

So nebenbei: das ist auch der Grund warum Span<T> nur "stack-only" ist, da es ohne Laufzeiteinbußen sonst nicht möglich ist atomare Vorgänge damit abzubilden. Da es eben nur auf dem Stack gestattet ist, gibt es kein Problem mit nebenläufigen Zugriffen.


mfG Gü
07.08.2020 21:37 Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

avatar-4140.png


Dabei seit: 03.02.2012
Beiträge: 1.373
Entwicklungsumgebung: Visual Studio Preview
Herkunft: NRW

Themenstarter Thema begonnen von Palladin007

Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das sind so Details, die ich mir von so einer Lektüre erhofft hätte - auch wenn sich das in diesem Fall nicht ausschließlich auf .NET bezieht, ist es trotzdem für .NET relevant und wichtig.

Danke für die Aufklärung :)
08.08.2020 01:51 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.849
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo gfoidl,

Zitat von gfoidl:
volatile hat mit "atomar" nichts zu tun. Das sind zwei verschiedene Dinge -- beide haben ihren Ursprung zwar im "Threading", aber sind dennoch grundverschieden.

volatile ist ein Modifizierer für die Sichtbarkeit der Variable.

Das stimmt m.E. so aber auch nicht, denn volatile kann eben nur auf "atomare" Datentypen angewendet werden:  volatile bzw.  Volatile fields.
Und mit Sichtbarkeit auch nicht, sondern ob der Compiler bzw. das Runtime-System intern die Befehle neu anordnen oder Lese-/Schreibvorgänge eliminieren darf.
08.08.2020 07:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.681
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Th69,

Zitat:
Und mit Sichtbarkeit auch nicht

Entsprechend dem Speichermodell (memory model) der CPU / Threads geht es bei volatile genau um die Sichtbarkeit (der Werte).
Z.B. dass der Wert nicht in einem Register gehalten werden darf, und somit "unsichtbar" für andere Threads ist, sondern "sichtbar" im Speicher sein muss. Mit "Speicher" sind hier auch allfällige Cache-Hierarchien gemeint und da geht es erst recht um die Sichtbarkeit (der Änderungen).
Zusätzlich wird beim Lesen ein "acquire fence" und ein "release fence" beim Schreiben gesetzt, so dass andere Lese-/Schreibvorgänge in Bezug auf den "fence" nicht umgeordnet werden dürfen. Auch dabei geht es um die Sichtbarkeit.
(Anm.: die "fences" sind auch Begriffe aus dem Speichermodell).

Vllt. hätte ich in der vorigen Antwort bei Sichtbarkeit den Bezug zum Speichermodell explizit herstellen sollen, denn mit Sichtbarkeit kann auch mehr gemeint sein (wie public, private, etc.) und somit hast du (in dieser Hinsicht) recht ;-)

Zitat:
der Compiler bzw. das Runtime-System

Auch die CPU ist dabei betroffen.
Der/die Compiler dürfen beim Optimieren den Code nur so verändern, dass die "fences" von volatile erhalten bleiben.
Die Runtime / Execution Engine / VM müssen auch die "fences" erhalten lassen.
Die CPU muss dafür sorgen, dass in Bezug auf die "fences" die Sichtbarkeit des Speicherbereichs gegeben ist und darf keine Pipeline-Optimierungen vornehmen welche eine "fence" verletzen würden.

Intel x84/x64 ist hier von Haus aus eher streng ("strong memory model"), aber z.B. Arm-Prozessoren sind hier sehr locker ("weak memory model"). Daher ist für plattformübergreifenden Code und Threading die Kenntnis der Speichermodelle -- zu einem bestimmten Grade -- nicht ganz unwesentlich.

Einschub:
Kestrel (ein Server von ASP.NET Core) lief anfänglich nur auf x86*. Da in der Cloud immer mehr Arm64-CPUs Einzug halten, gab es folglich den Wunsch dass Kestrel auch Arm64 unterstützt. Wie sich jeder vorstellen kann sind Webserver sehr nebenläufig und parallelisiert. Ein großer Punkt für die Unterstützung von Arm64 war das "weak memory Model" und die korrekte Handhabung der Speicherzugriffen.
Neben ausführlichen Reviews für die Pull Requests werden zur Überprüfung auch jede Menge "Fuzz Tests" durchgeführt, denn gerade bei "Threading" ist nur durch "Hinschauen" nciht so einfach potentielle Fallstricke erkennen zu können.

* wird nur x86 angegeben, so sind Intel kompatible 32-/64-bit Systeme gemeint.
Andernfalls wird explizit von x86 und x64 od. Arm64 / Arm32, etc. gesprochen.

Zitat:
volatile kann eben nur auf "atomare" Datentypen angewendet

Danke dass du das ergänzt, ist aber auch nicht ganz korrekt / präzise (obwohl ich deine Intention dahinter sehr wohl verstehe).

volatile für Datentypen die größer als die Wortbreite der CPU sind machen keinen Sinn, da so das Prinzip von volatile nicht umgesetzt werden kann.

Dass der C#-Compiler hier long, double ausnimmt, liegt darin begründet dass .NET Anwendung plattformunabhängig laufen sollen, d.h. sowohl auf x86 und x64 und auf 32-bit Systemen (x86) sind diese beiden Datentypen nicht atomar.

Daher auch das "fast" oben, denn auf x64 sind double und long atomare Datentypen, dennoch kann volatile nicht darauf angewandt werden.
Gleiches gilt für atomare Werttypen auf die volatile nicht angewandt werden kann. Z.B.

C#-Code:
public struct Foo
{
    public int A;
}

ist perfekt atomar, dennoch geht volatile nicht.

Als ich meine Antwort verfasste sah ich "atomar" nur in Bezug auf das von mir Zitierte.
Da sehe ich diesen Punkt immer noch als passend an, aber allgemein gesehen ist dieser Punkt zu unpräzise.

Ich bin immer wieder froh, dass es ein Forum gibt welches solche unpräzisen Punkte aufgreift :-)


Hallo Palladin007,

Zitat:
Das sind so Details, die ich mir von so einer Lektüre erhofft hätte

Wenn du einen Punkt hast der dich interessiert, so kannst du ja eine Frage im Forum stellen. Irgendwer wird schon eine Antwort schreiben... ;-)

mfG Gü
08.08.2020 11:05 Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

avatar-4140.png


Dabei seit: 03.02.2012
Beiträge: 1.373
Entwicklungsumgebung: Visual Studio Preview
Herkunft: NRW

Themenstarter Thema begonnen von Palladin007

Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für die ausführliche Aufklärung - hast Du Lust, ein Buch zu schreiben? :D

Zitat:
Wenn du einen Punkt hast der dich interessiert, so kannst du ja eine Frage im Forum stellen.

Dann wäre ich nur noch mit Fragen stellen beschäftigt und würde das Forum im Alleingang füllen :D

Ich hatte gehofft, ein Buch zu finden, in dem ich z.B. Abends ohne PC etwas lesen und so mein Allgemeinwissen etwas spezifischer ausweiten kann. Mir ist klar, dass ich dadurch nicht zum Experten werde, aber es kann schon viel ausmachen, einige Begriffe schon mal gehört/gelesen zu haben.
08.08.2020 16:06 Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 935


witte ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Na das ist ja nun nicht schwer sich ein paar Blogs zu merken und jeden Abend mal ein Artikel zu lesen oder ein C#-Keyword nachzulesen oder ein Kapitel aus der C#-language spec wenn man sich durch trockenes Brot fräsen will ...

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von witte am 08.08.2020 17:03.

08.08.2020 16:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.681
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Palladin007,

dazu hab ich (leider) keine Muße / Zeit ;-)
Irgendwie interessant wäre es aber ein Buch der Art "Perlen von myCSharp.de" (o.ä.) zu erstellen, denn hier im Forum gibt es schon sehr viele gute tiefgründige Beiträge, die z.T. auch zeitlos sind.

Zitat:
Dann wäre ich nur noch mit Fragen stellen beschäftigt und würde das Forum im Alleingang füllen :D

Warum auch nicht?

mfG Gü
08.08.2020 17:41 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 5 Monate.
Der letzte Beitrag ist älter als 5 Monate.
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 17.01.2021 23:12