C言語で、2つのスレッドを同期するに、下記のようなプログラムを書きました。
volatile int hoge = 0;
//...
void fuga1() // スレッド1で動いている
{
while (1)
{
while (hoge == 0) // 値が変わるまで待つ
sleep(1);
puts("fuga1!");
hoge = 0;
}
}
void fuga2() // スレッド2で動いている
{
while (1)
{
sleep(1000); // 1秒待つ
hoge = 1;
}
}
このプログラムは特に問題なく動いていて、1秒毎に「fuga1」が出力されています。
しかし、「これはvolatile
の正しい使い方ではない」、「スレッド間の同期にvolatile
を使うな」とは聞いたことあります。具体的になぜなのか、誰か教えていただけますでしょうか。
hoge
は正しくpthreadのmutexで保護されていますので、volatile int hoge
ではなくint hoge
で十分かと思います。 – yohjp Dec 17 '14 at 09:12while
の中で変数hoge
を変更していないので、(あくまでもコンパイラ次第ですが)volatile でないとhoge == 0
の判定をwhile
の外側で行うような最適化が加えられてしまう可能性があるのではないかと思いますが、それは無用な心配でしたでしょうか? – pandax381 Dec 17 '14 at 09:19