え?volatile?何それ美味しいの?

ボラタイル。使わんね。。

ポーリングをwhileとsleepで回すとか正気の沙汰か。
一定間隔でイベントループを走らせるAPIを使った方が安心。
組み込み系でCしか使えないなら仕方ないのかもしれないけど。。

※volatileの使いどころ

while(i==0)
{
//iは変更しない処理
}

↑と↓は、iに対して変更が無いため、コンパイラに等価と判断される。
つまり、↑のコードをコンパイルすると↓に最適化され、
ループ毎にiが評価されなくなってしまう。
(別ループや別スレッドがiを変更する可能性は考慮されない)
iの宣言でvolatileを付加しておくと、最適化が行われなくなる。

if(i==0)
{
while()
{
//iは変更しない処理
}
}

2件のコメント

  1. よくわからないけどマルチスレッドで i は他から操作されるってことかしら?

  2. 別スレッドか、別ループからの書き換えが行われます。
    たとえば、I/O周りでデータ待ちで使うポーリングを想像してください。