10

C++ プロジェクトでスレッドをサポートするために、boost::thread ライブラリ (V1.44) を使用しています。

ユーザーは、独自のスレッドで実行されているテスト ループの実行を無制限に一時停止し、いつでも再開できる必要があります。

Windowsでは、このように解決しました

bool ContintueLoop(){
if(testLoopPaused){ //testLoopPaused can be set by the user via  GUI elements
  try{
      boost::this_thread::interruptible_wait( 2147483648 ); //that's very ugly,
      // somebody knows the right way to pause it for a unlimited time?
      return true;
     }
  catch( boost::thread_interrupted& e ){ //when the user selects resume the 
      // the thread is interrupted and continues from here
      testLoopPaused = false;
      return true;
     }
if( ... ) //test for other flags like endTestLoop etc.
  ....
}

これは問題なく機能しますが、無制限の中断の正しい値を知っていると便利です。

プログラムの Linux 版の実装を開始しましたが、コンパイラ エラーが発生するという問題に遭遇しました。

エラー:interruptible_waitのメンバーではありませんboost::this_thread

質問: boost::thread を無制限に (ユーザーが再開するまで) 一時停止する良い方法は何ですか?

どうもありがとうございました

4

2 に答える 2

18

boost::thread を使用して任意の時点でスレッドを一時停止する方法は知りませんが、説明した状況はブール値、ミューテックス、および条件変数を使用して実装できます。

bool m_pause; // initialise to false in constructor!
boost::mutex m_pause_mutex;
boost::condition_variable m_pause_changed;

void block_while_paused()
{
    boost::unique_lock<boost::mutex> lock(m_pause_mutex);
    while(m_pause)
    {
        m_pause_changed.wait(lock);
    }
}

void set_paused(bool new_value)
{
    {
        boost::unique_lock<boost::mutex> lock(m_pause_mutex);
        m_pause = new_value;
    }

    m_pause_changed.notify_all();
}

したがって、ワーカー スレッドでは、block_while_paused()m_pause が false に設定されるまで返されない定期的に呼び出すことができます。メイン スレッドset_paused(value)では、一時停止変数の値をスレッド セーフな方法で更新するために呼び出します。

免責事項: これは、ここにある類似のコードから改変されていますが、実際に動作することを確認するどころか、改変されたコードをコンパイルしようとはしていません :)

于 2010-12-16T09:43:57.840 に答える
1

上記の機能 (イベントが発生するまでスレッドをスリープ状態にする) が必要であり、ブースト ライブラリの使用に慣れている場合、Boost.Interprocessライブラリは、問題の説明に従って使用できるセマフォメカニズムを提供します。

于 2014-01-30T11:10:30.203 に答える