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.
Es sieht aus wie einige schlecht gemachte Spin-Lock in Multi-Thread-Code. –
Vielleicht ist es zum Debuggen? – animaonline
Code wie dieser wird normalerweise in Programmen für Mikrocontroller gefunden. – alexander