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を使うな」とは聞いたことあります。具体的になぜなのか、誰か教えていただけますでしょうか。