あれ、無限ループ中のフラグ処理が無視されてる……。
環境はLinux。スレッドを複数使用し、各スレッドに共通のフラグを使ってスレッド内部で条件分岐をさせようとしたときの話です。
bool image_flag = false;
void* thread_1(){
while(1){
if(is_button_pushed()){
image_flag = true;
}
}
return NULL;
}
void* thread_2(){
if(image_flag){
take_image();
image_flag = false;
}
return NULL;
}
上記のプログラムのようにスレッド1でカメラ撮影のフラグが立った場合に、スレッド2でカメラ撮影を行う関数を呼び出そうとしたのですが何故かimage_flagをtrueにしてもtake_image関数が呼び出されることはありませんでした。
コンパイルで最適化を行うと処理がはぶかれることがある
下記のサイトに答えが示してありました。
なるほど。。。今回の場合ですと、おそらくimage_flagが常にfalseであると認識して消してしまったみたいですね。
volatile識別子をつけると動きました。
ありがたや。。。