Laden...

Schlüsselwort volatile verstehen

Erstellt von kaepten vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.309 Views
K
kaepten Themenstarter:in
239 Beiträge seit 2005
vor 16 Jahren
Schlüsselwort volatile verstehen

Hallo Forum

Ich bin Heute zum 1. Mal über dieses Schlüsselwort gestolpert. Ich habe natürlich in der MSDN nachgeschlagen, verstehe aber dennoch den tiefen Sinn in der Praxis nicht.

Kann mir jemand an einem Fallbeispiel zeigen, wo volatile wirklich nötig ist und man ohne nicht weiter kommt?

Vielen Dank
kaepten

915 Beiträge seit 2006
vor 16 Jahren

Hallo kaepten,

volatile kommt relativ selten vor, muss zugeben hatte bisher nie den Fall das ich es gebraucht hätte. Volatile ist nichts anderes als ein synchron gehaltenes object das man wenn überhaupt in Multithreading-Anwendungen findet. Was man dabei beachten sollte das lokale Variablen nicht als volatile deklariert werden können und eben bei übergaben wie ref Fehler auslösen. Wobei ich jetzt auch nicht zu 100% sicher bin ob in und out davon auch betroffen sind - nie probiert.

Denke mal hattest die englische MSDN Seite aufgerufen finde es da etwas "schwieriger" erklärt. Die Deutsche Seite ist da besser.

Ein Anwendungsfall wäre z.B. ne Liste die von mehreren Threads befüllt oder verändert wird. Aber schrieb da meistens lieber ein lock hin 🙂

/ps
Denke wenn einfach mal im Forum "volatile" in die Suche eingibst wird es da sicher einige Treffer geben mit Beispielen geben.

[Edit] Den etwas schwerfälligen Satzbau verändert 😉

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

S
8.746 Beiträge seit 2005
vor 16 Jahren

Volatile betrifft Optimierungen durch den Prozessor selbst. Der kann nämlich die Ausführungsreihenfolge von Feld-Zugriffen verändern beim, was zu ziemlich schrägen Effekten führen kann:

Thread;

x = 5;
y = 3;

Sind x und y nicht als volatil gekennzeichnet, dann kann auch zuerst y =3 und dann x=5 ausgeführt werden. Dieser Fall wird dann kritisch, wenn man eine Variable verwendet um den Thread-Abbruch zu signalisieren:

Thread-Code:

...
result = 3;
threadFinished = true;

Main-Thread-Code:

while(!threadFinished)
{
}
threadResult = result;
K
kaepten Themenstarter:in
239 Beiträge seit 2005
vor 16 Jahren

@sevenson
Sehr schön, das Beispiel kann ich verstehen.

Die Forumssuche brachte mir eben nicht direkt Beispiele wo man auf volatile nicht verzichten könnte bzw. wo beschrieben wird, was passiert wenn man es nicht einsetzt.

kaepten

U
1.688 Beiträge seit 2007
vor 16 Jahren

Früher, zu DOS-Zeiten, wurde volatile z. B. dazu verwendet, dem Compiler zu signalisieren, dass sich eine Variable zu jeder Zeit (etwa durch einen Interrupt) ändern kann.