9

私のアプリケーションでは、Boostスレッドの代わりにC++0xスレッドを使用することを検討しています。ただし、標準のC ++ 0xスレッドにはメソッドがないように見えるため、これを再実装する方法がわかりませんinterrupt()

私の現在の設定は次のとおりです。

  • 作業を管理するマスタースレッド。
  • マスターのコマンドを実行するいくつかのワーカースレッド。

ワーカーはwait()、少なくとも2つの異なる条件変数を呼び出します。マスターには「タイムアウト」状態があります。この場合、すべてのワーカーに停止して、それまでに得た結果を出すように指示します。Boostスレッドでは、マスターinterrupt_all()はスレッドグループを使用するだけで、ワーカーは待機を停止します。現時点で待機していない場合、マスターはboolワーカーが定期的にチェックするフラグも設定します。

ただし、C ++ 0xではstd::thread、の代わりにはなりませんinterrupt()。私は何かが恋しいですか?そうでない場合、どうすれば上記のスキームを実装して、労働者が永遠に眠ることができないようにすることができますか?

4

3 に答える 3

10

残念ながら、ポーリング以外の方法はありません。待機を使用する代わりに、時間指定の待機と変数を使用して、中断が行われたことを示します。

void th(Interruptor& interruptor) {
  try {

    ...

    while (cnd1.timed_wait(d)==false) {
      interruptor.check_interruption_point();
    }
    ...
  } catch (interrupted_exception &) {}
}

Interruptorクラスは、ブール変数がミューテックスで保護されているか、アトミック操作を使用している場合は、ブール変数を維持します。2つの関数interruptとcheck_interruption_pointは、ブールがtrueの場合にinterrupted_exceptionをスローします。Materスレッドは、作成時に関係するスレッドに与えられるInterruptor変数を作成します。マスターには、この割り込みに依存するすべてのスレッドを一度に割り込みする可能性があります。もちろん、一度に1つのスレッドを明示的に割り込みたい場合は、スレッドごとに割り込みを作成できます。

時間指定待機の期間を定義するのはあなた次第です。これにより、プログラムが必要とするときにスレッドがすぐに反応できるようになります。

于 2010-05-16T23:03:38.440 に答える
2

ブーストがinterrupt()で行う待機は、スレッドが現在ブロックされているという条件でnotify_allを発行し、割り込みが要求されたかどうかを確認することです。割り込みが要求された場合は、throw boost::thread_interruptedを実行します。このメカニズムを使用して、std::threadに基づいて独自のスレッドクラスを作成できます。

于 2010-08-30T11:08:34.313 に答える
2

実際、C ++ 11 std :: threadは、このための標準メカニズムを提供していません(まだ?)。したがって、当面は、@doublepがboost::threadを使用するという決定を2番目に行います。

C ++ 11std::ファシリティを使用することをお勧めします。terminate()しかし、理由もなく、スリープなどを中断するための条件変数のファッティングを備えたブーストの機能を再構築したくありません。そのようなインフラストラクチャを作成することは楽しく、それほど難しくはありませんが、ブーストを使用するよりも非生産的で標準的ではありません。

これは、boost::threadとstd::threadが非常に似ているため、自分自身を隅に追いやっていないと感じるのに役立ちます。(最終的なstd :: threadへの移行は比較的簡単で、おそらく些細なことでさえあると予想しています。)

于 2013-12-12T13:59:13.360 に答える