LoginSignup
1
1
お題は不問!Qiita Engineer Festa 2023で記事投稿!

C++のプログラムで無限ループ中のフラグが無視される

Posted at

あれ、無限ループ中のフラグ処理が無視されてる……。

環境は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識別子をつけると動きました。

ありがたや。。。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1