天天看點

你了解C語言中的關鍵字volatile嗎?

   我們在學習C語言的32個關鍵字時,大家都不太注意volatile這個關鍵字,volatile是一個類型修飾符。volatile的中文意思是“易變的”。那麼在程式中我們在什麼情況下才使用他呢?我們在分析核心時經常看到這個關鍵字的使用。舉例如下:

struct task_struct {  

        volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */  

        void *stack;  

        atomic_t usage;  

        unsigned int flags;     /* per process flags, defined below */  

        unsigned int ptrace;  

.......  

struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; atomic_t usage; unsigned int flags; /* per process flags, defined below */ unsigned int ptrace; .......

       在應用程式中,volatile主要是被設計用來修飾被不同線程通路和修改的變量。

       volatile的變量是說這變量可能會被意想不到地改變,是以編譯器不要進行相應的優化。精确地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用儲存在寄存器裡的備份。

      例如:

      extern int a;//語句1  假設a是一個全局變量

     ......

      int b=a; //語句2

      int c=a;  //語句3

      語句2與語句3中都使用了a的值,優化器在語句3中引用a的值時,認為語句2中已經将a的值讀到寄存器中了,并且在語句2與語句3之間沒有對a進行修改,是以沒必要再到記憶體中去讀a的值,是以直接使用了寄存器中的值。但是如果在語句3執行前,産生了中斷,中斷恰好對a進行了修改。那麼語句3取出來的值就有問題了。

      如果上面的全局變量a是被修飾為volatile的話,那麼優化器就不能去優化語句3,要到記憶體中去重新取值。

     作為嵌入式系統程式員,volatile一定要知道如何使用。

繼續閱讀