0

私は 2 つのタスクを実行している 1 つの問題に直面しています。1 つは親タスクで、もう 1 つは子タスクで、子タスクは 1 つの無限ループを実行しており、いくつかの条件が満たされている場合、子の実行を手動で終了したいと考えています。TBBでできること

4

1 に答える 1

1

タスクを突然終了しますか、それとも単にループをうまく終了させたいですか?タスクが自動的に終了できるようにしますか?

最初のケースでは、おそらくdestroyメソッドを使用できます

2番目のケースは、おそらくコードを構造化するためのより良い方法です。ループに次のような条件があるとしましょう

while(!finished) {
  ...
}

これを変更して変数のロックを使用するfinishedことで、タスクの外部から変数にアクセスしたり、タスクを終了するときにその値を変更したりできます。タスクの外部と内部の両方で変数に直接アクセスする代わりに、次の関数を使用して値を読み書きする必要があります。

tbb::mutex lock;
bool finished;

void finish() {
  lock.lock();
  finished = true;
  lock.unlock();
}

bool is_finished() {
  lock.lock();
  bool ret = finished;
  lock.unlock();
  return ret;
}

したがって、ループ条件は次のようになりwhile(! is_finished()) ます。メインスレッドのどこかで、task.finish()終了したいときに呼び出すだけです。

于 2013-03-22T10:11:19.837 に答える