2011-09-06 11 views
15

私はfind_the_question()関数によって実行されるブロッキングタスクを持っています。しかし、私はこの関数を実行するスレッドが10秒以上かかることは望ましくありません。したがって、10秒以上かかる場合は、すべてのリソースを消去してそのスレッドを閉じたいと考えています。ブーストスレッド - 割り込みを受け付ける方法

私はそのためのコードを書こうとしましたが、スレッドが10秒以上かかると、何とかfind_the_question()関数で割り込みを取得できませんでした。何が間違っているのか教えてください。

void find_the_question(std::string value) 
{ 
    //allocate x resources 
    try{ 
     //do some process on resources 
      sleep(14); 
     //clean resources 
    } 
    catch(boost::thread_interrupted const&) 
    { 
     //clean resources 
     std::cout << "Worker thread interrupted" << std::endl; 
    } 
} 

int main() 
{ 
     boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(10000); 
     std::cout << "In main" << std::endl; 
     boost::thread t1(find_the_question, "Can you block me"); 

     t1.interrupt(); 
     if (t1.timed_join(timeout)) 
     { 
      //finished 
      std::cout << "Worker thread finished" << std::endl; 
     } 
     else 
     { 
      //Not finished; 
      std::cout << "Worker thread not finished" << std::endl; 
     } 

     std::cout << "In main end" << std::endl; 
} 

出力: t1が完了するまでに10秒以上かかる場合、私は以下のコンソール出力を取得しています。

std::cout << "In main" << std::endl; 
std::cout << "Worker thread not finished" << std::endl; 
std::cout << "In main end" << std::endl; 

のに対し、私はあなたが私が間違っているのを教えてもらえ出力

std::cout << "In main" << std::endl; 
std::cout << "Worker thread interrupted" << std::endl; 
std::cout << "Worker thread not finished" << std::endl; 
std::cout << "In main end" << std::endl; 

次期待しています。ブースト::スレッド::割り込みを()を使用して、事前

+5

あなたが使用している 'sleep(14);'これは 'boost :: thread'からのスリープですか、それともスリープ関数ですか?割り込みは 'boost :: thread:sleep'でのみ機能するので – mkaes

答えて

25

おかげで、あなたはそれを動作させるためにブースト::スレッド::睡眠を()を使用する必要があります。

実行中のスレッドは、対応するboost :: threadオブジェクトのinterrupt()メンバ の関数を呼び出すことによって中断できます。 中断されたスレッドが 中断を有効にして指定された中断点 ポイントの1つを実行した場合(または現在実行中にブロックされている場合)、中断されたスレッドでboost :: thread_interrupted例外がスローされます。キャッチされない場合、これにより、中断されたスレッドの実行が終了する が発生します。任意 他の例外と同様に、スタックが巻き戻さなり、自動保存期間の オブジェクトのデストラクタは

事前定義された中断点に実行されます

以下の機能がなる、中断点であるが boost :: thread_interrupted現在のスレッドに対して現在の スレッドの割り込みが有効で、割り込みが要求されている場合、現在のスレッドに対して割り込みが要求されています。

boost::thread::join() 
boost::thread::timed_join() 
boost::condition_variable::wait() 
boost::condition_variable::timed_wait() 
boost::condition_variable_any::wait() 
boost::condition_variable_any::timed_wait() 
boost::thread::sleep() 
boost::this_thread::sleep() 
boost::this_thread::interruption_point() 
関連する問題