c++ - 変数 - スレッド プログラミング




条件が発生するまでスレッドを待機させる (3)

C ++ 11がなくてもPOSIXスレッドをサポートするシステムを持っている場合は、条件変数を使用できます。 他にも選択肢がありますが、あなたの問題を記述した方法で条件変数が最も単純です。

pthread条件変数は、mutexとともに使用されます。 条件変数のトリックは、待っているコールが戻ってくるまで、取得したミューテックスを解放し、その時点で再びミューテックスを取得したことです。 シーケンスは次のとおりです。

  • ミューテックスを取得する
  • PREDICATEは真ではありません
    • 条件変数を待つ
  • クリティカルセクションで作業する
  • PREDICATEがtrueの場合
    • 信号条件変数
  • ミューテックスを解放する

信号ステップは、複数のスレッドが上記の同じクリティカルセクションに入る場合に使用されます。

PREDICATEに影響を与える状態を変更するために、別のスレッドが同じミューテックスにアクセスする可能性がある場合、そのスレッドは誰かに通知する必要があるかどうかをチェックする必要があります。

  • ミューテックスを取得する
  • クリティカルセクションで作業する
  • PREDICATEがtrueの場合
    • 信号条件変数
  • ミューテックスを解放する

対象となるPOSIXコマンドは次のとおりです。

pthread_mutex_init()
pthread_mutex_destroy()
pthread_mutex_lock()
pthread_mutex_unlock()
pthread_cond_init()
pthread_cond_destroy()
pthread_cond_wait()
pthread_cond_signal()

条件が発生するまでSimultaneousシミュレータで実行された2つのスレッドのうちの1つのスレッドを待っています。条件が待機スレッドが再び実行された後、シミュレータでプログラムを実行して1000回以上実行した後に、どうすればいい?


シグナリングにセマフォを使用する。 例(アプリケーションクリーン出口)は次のようになります。

ヘッダーで宣言する

static sem_t semPrepareExit;            //declaration

ソース(メインスレッド);

sem_init(&semPrepareExit, 0, 0);        ///semaphore initialized
...
///now wait for the signal on the semaphore, to proceed hereforth
sem_post(&semPrepareExit);
/// cleanup ahead
...

ソースでは、(spawned-thread);

...
sem_post(&semPrepareExit);

さて、あなたは "sem_post"を使ってセマフォに信号を送るとすぐに。 メインスレッドは、待機ノード/ポイントで信号を受信し、その先に進む。


次のようなものを試してください:

class CmyClass
{
   boost::mutex mtxEventWait;
   bool WaitForEvent(long milliseconds);
   boost::condition cndSignalEvent;
};

bool CmyClass::WaitForEvent(long milliseconds)
{
   boost::mutex::scoped_lock mtxWaitLock(mtxEventWait);
   boost::posix_time::time_duration wait_duration = boost::posix_time::milliseconds(milliseconds); 
   boost::system_time const timeout=boost::get_system_time()+wait_duration; 
   return cndSignalEvent.timed_wait(mtxEventWait,timeout); // wait until signal Event 
}

//待機するためにinorderを呼び出し、WaitForEventメソッドを呼び出します

WaitForEvent(1000); // it will timeout after 1 second

//これは、イベントを通知する方法です。

cndSignalEvent.notify_one();






simulator