C言語のキーワードvolatileを知っていますか?
私たちはC言語の32のキーワードを勉強する時、みんなはvolatileというキーワードにあまり注意していません.volatileはタイプの修飾子です.volatileの中国語の意味は「変わりやすい」です.では、プログラムで私たちはどのような状況で彼を使用しますか?カーネルを分析するとき、このキーワードの使用をよく見ます.例を次に示します.
アプリケーションでは、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は必ず使い方を知っておく必要があります.
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は必ず使い方を知っておく必要があります.