7

Ich habe über flüchtige Keywords gelesen, aber ich weiß nicht, in welchen Situationen ich es verwenden sollte.Wo flüchtig zu verwenden?

Wann wird der Speicher (Variable) aktualisiert und der Prozess ist sich dessen nicht bewusst?

In welchen Fällen sollten Treiber flüchtige Variablen verwenden?

+0

Siehe: http://stackoverflow.com/questions/2535148/volatile-qualifier-and-compiler-reorderings (Obwohl die andere Frage hat C++ und C-Tags erinnern, dass C++ dieses Schlüsselwort von C.) – dirkgently

+0

Von Dr Dobbs - http://www.drdobbs.com/184403766;jsessionid=4HI2GRADWCN51QE1GHRSKHWATMY32JVN – pankajt

+0

Siehe [ Warum wird volatile in c benötigt? ] (http://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c). –

Antwort

12

Der häufigste Fall in meiner Welt ist, wenn Sie Mikrocontroller programmieren, die Memory-Mapped I/O verwenden. Der Wert in einem Register könnte sich aufgrund von externen digitalen Eingängen ändern. Wenn Sie jedoch keine Variable als volatile deklarieren, könnte der Compiler den Code vollständig optimieren, und Sie werden sich wundern, warum nichts funktioniert.

Matt schlug vor, dass ich auf der Aussage hinsichtlich des Codes, der "heraus optimiert wird" verschönern. Memory-Mapped I/O wird im Code über Zeiger angesprochen. Wenn Sie den Status einer Schaltfläche überprüfen möchten, werden Sie normalerweise bitweise den Wert des Registers mit der Bitmaske für die Schaltfläche UND. Wenn Sie nicht volatile angeben, sagt der Compiler: "hey, Ihr Code ändert den Wert dieses Zeigers nie wirklich, also werde ich diese Anweisung einfach entfernen, wo Sie sie bitweise UND-verknüpft haben, weil der Wert immer ist das Gleiche!".

Hoffentlich löscht dies meine Aussage ein wenig. Danke für den Vorschlag, Matt.

+1

Sie sollten darauf eingehen, was Sie unter "Optimieren" verstehen, obwohl es für einige von uns bekannt ist, was dies bedeutet, es könnte nicht für jeden sein. –

-1

Flüchtige Variablen sind Variablen, die jederzeit geändert werden können, ohne dass das Programm davon weiß.

Ich kann nicht an irgendeine Verwendung für das flüchtige Schlüsselwort im täglichen Programmieren denken, aber es kann aufspringen.

+0

Er fragte nicht nach einer Definition, er bat um die Verwendung. – RPM1984

+0

Alexander hat Recht. Er verdient keinen Abschlag. Die obigen Beispiele veranschaulichen dies. Ein Beispiel im täglichen Gebrauch ist, wenn Sie einen Zeiger auf die Variable verwenden. Der Compiler kann nicht erkennen, dass etwas die Variable über den Zeiger geändert hat. – Eddy

3

Ihnen hilfreich sein könnten Wie Sie dies mit dem linux-device-driver Tag markiert haben, ist möglicherweise um einige spezifische Beratung innerhalb des Linux-Kernels für die Codierung.

Im Allgemeinen sollten Sie in Ihrem Linux-Kernel-Code nicht schreiben müssen. In den Fällen, in denen volatile möglicherweise erforderlich ist, ist seine Verwendung in Kernkernfunktionen verpackt, die Sie stattdessen aufrufen sollten. Zum Beispiel, wenn Sie Memory-Mapped I tun/O, dann sollten Sie ioremap(), writel() verwenden sein, readl() usw.

-1

Aus meinem Wissen in C das volatile Schlüsselwort soll verwendet werden, wenn gleichzeitig unsynchronisierten Operationen ausgeführt werden auf eine Variable aus mehr als einer Quelle (Prozess). Wenn die Variable volatile deklariert ist, greifen alle Prozesse immer direkt von ihrem Speicherort auf die Variable zu, anstatt die Variable in den Cache des Mikroprozessors zu kopieren und von dort auf sie zuzugreifen.
Beachten Sie, dass dies die Leistung für diese bestimmte Variable deutlich verringern wird. Die Zugriffszeit für In-Memory-Variablen liegt in der Größenordnung von Millisekunden, während sie für Cache-Variablen der 1. Ebene oder 2. Ebene etwa Zehntel Nanosekunden beträgt. Verwenden Sie sie daher nur, wenn alle anderen Optionen berücksichtigt wurden.

+0

ist es möglich, gleichzeitige unsynchronisierte Operationen für eine Variable aus mehr als einer Quelle (Prozess) zu machen? – Pointer

+0

@Yogesh: ja. Das einfachste Beispiel ist eine Variable, die von einem Signal-Handler geschrieben und in der Hauptschleife eines Programms gelesen wird (z. B. ein Flag "Bereinigen und Beenden so bald wie möglich"). Andere umfassen verschiedene Formen von gemeinsam genutztem Speicher, beispielsweise eine gemeinsam genutzte Speicherabbilddatei. –

2

Abgesehen von dem, was andere gesagt haben, ist volatile Schlüsselwort im Allgemeinen zu verhindern, dass der Compiler die Optimierung durchführt. In bestimmten Speicher-Mapped-Registern, in denen der Wert der Register auf Chinagin bleibt, wird wie bei einem rtc-Clock-Wert ein flüchtiges Schlüsselwort verwendet. Werfen Sie einen Blick auf dieses Beispiel:

RTC_CLOCK _time; 
TIME _currentTime = _time ; 
while(_currentTime - _time >= 100) 
{ 

//Do something 

} 

//rest of the code 

Wenn wir vor unserer Zeit nicht das Schlüsselwort volatile anhängen dieser Code wie dies als _currentTime sein - _time = 0 und der Compiler wird die while-Schleife darunter nicht berücksichtigen .:

RTC_CLOCK _time; 
TIME _currentTime = _time ; 
//rest of the code 

Um dies zu verhindern, müssen wir das flüchtige Schlüsselwort mit der TIME verwenden.

+0

ausgezeichnete Beton, leicht zu verstehen, Antwort. und NICHT voll von falschem Mist darüber, wie es Nebenläufigkeit hilft. –

Verwandte Themen