4

無限ループになるまで実行し続けたいスレッドが 3 つあります。スレッドは状態を持つオブジェクトで動作し、各スレッドはオブジェクトの状態に基づいて実行またはスリープします。入力スレッドが状態 = 1 の新しいオブジェクトをチェックし続け、それを処理し続けるか、それ以外の場合は待機するようにします。

class myclass{
    int state;

    myclass(){
        this->state = 0;
    }
    void setState(int x){
        // set this->state to x
    }
    int getState(){
        // return this->state
    }
    // stuff
}

void foo1(myclass* ob){
    // stuff
    while(ob->getState() != 0 || ob->getState() != 1)
    {
        // sleep for 500 ms
    }
    ob->setState(1);
}

void foo2(myclass* ob){
    // stuff
    while(ob->getState() != 1)
    {
        // sleep for 500 ms
    }
    ob->setState(2);
}

void foo3(myclass* ob){
    while(ob->getState() != 2)
    {
        // sleep for 500 ms
    }
    // stuff
    ob->setState(1);
}

int main(){
    myclass* ob = new myclass();
    boost::thread input_thread(boost::bind(&foo1, ob));
    boost::thread process_thread(boost::bind(&foo2, ob));
    boost::thread output_thread(boost::bind(&foo3, ob));

    // stuff
    // join all three threads
}

foo2 と foo3 の while ループは、入力スレッドとプロセス スレッドで問題なく機能しますが、foo1 の while では、作成されて入力/処理/出力に渡される新しいオブジェクトがある場合でも、入力スレッドが無限ループになります。注: 私の実装では、動的メモリ データ構造を使用して、リアルタイム データに基づいて新しいオブジェクトを作成して渡します。

私の質問:

  • なぜこれが起こるのですか?
  • スレッドが無限ループで新しいオブジェクトを待機し、到着したときにそれらを操作するより良い代替手段は何でしょうか? システムをスケールアップする際のオーバーヘッドを削減するためにミューテックスを使用せずに回避策を知りたいです。
4

1 に答える 1