2012-05-11 11 views
6

Ich sah dies in einem Teil, der nie in einem Kollegen Code aufgerufen wird:Was macht while (! Volatile); machen?

in der Header-Datei deklariert, wird
volatile unsigned char vol_flag = 0; 
// ... 
while(!vol_flag); 

vol_flag aber nie geändert. Habe ich Recht, dass dies dazu führt, dass das Programm in einer Endlosschleife hängt? Gibt es einen Ausweg?

+2

Es sieht aus wie einige schlecht gemachte Spin-Lock in Multi-Thread-Code. –

+1

Vielleicht ist es zum Debuggen? – animaonline

+2

Code wie dieser wird normalerweise in Programmen für Mikrocontroller gefunden. – alexander

Antwort

16

Normalerweise zeigt ein Code wie dieser an, dass vol_flag erwartet wird, dass extern irgendwann geändert wird. Hier kann external einen anderen Thread bedeuten, einen Interrupt-Handler, ein Stück Hardware (im Falle von Memory-Mapped IO) usw. Diese Schleife wartet effektiv auf das externe Ereignis, das das Flag ändert.

Das Schlüsselwort volatile ist eine Möglichkeit für den Programmierer, die Tatsache auszudrücken, dass es nicht sicher ist anzunehmen, was aus dem Code ersichtlich ist: nämlich, dass das Flag in der Schleife nicht geändert wird. Somit verhindert es, dass der Compiler Optimierungen vornimmt, die die Intentionen hinter dem Code gefährden könnten. Stattdessen muss der Compiler eine Speicherreferenz erstellen, um den Wert des Flags abzurufen.

Beachten Sie, dass (anders als in Java) volatile in C/C++ ist nicht festgelegt passiert-vor Beziehung und garantiert keine Bestellung oder Sichtbarkeit von Speicherreferenzen über flüchtigen Zugang. Außerdem gewährleistet es nicht die Atomarität von variablen Referenzen. Daher ist es kein Werkzeug für die Kommunikation zwischen Threads. Einzelheiten finden Sie unter this.