4

parallel_forから抜け出すための最も効率的な方法は何ですか?標準のforループから抜け出すために、次のようにします。

for(int i = 0; i < 100; i+)
{
    bool bValue = DoSomething();

   //Break if bValue is true
   if(bValue)
      break;
}

調査を行ったところ、PPLでキャンセル に関する情報が見つかり、 3つのオプションを検討しています。

-タスクグループ

// To enable cancelation, call parallel_for in a task group.
structured_task_group tg;

task_group_status status = tg.run_and_wait([&] 
{
   parallel_for(0, 100, [&](int i) 
   {

      bool bValue = DoSomething();
      if (bValue)
      {
         tg.cancel();
      }
   });
});

-例外をスローします

try
{
   parallel_for(0, 100, [&](int i) 
   {
      bool bValue = DoSomething();
      if (bValue)
          throw i;
   });
}
catch (int n)
{
   wcout << L"Caught " << n << endl;
}

-ブール値を使用します

// Create a Boolean flag to coordinate cancelation.
bool bCanceled = false;

parallel_for(0, 100, [&](int i) 
{       
   // Perform work if the task is not canceled.
   if (!bCanceled)
   {
       bool bValue = DoSomething();
       if (bValue)
          bCanceled = true;
   }
});
4

2 に答える 2

2

structured_task_groupオプションは、実際に合理的である唯一のものです。#3は単純に非常に安全ではなく、#2は単に例外の恐ろしい悪用です。

于 2012-09-10T18:37:19.157 に答える
2

Visual Studio 2012以降run_with_cancellation_token、ラムダを。とともに実行する関数がありcancellation_tokenます。ラムダの内部では、

リンク:run_with_cancellation_token関数

コード例は、MSDNの次の場所にあります。方法:キャンセルを使用して並列ループから抜け出す

C ++例外がその実装に関係しているのではないかと思うので、このアプローチの「効率」について話すことはできません。ただし、このコードは他のアプローチよりも単純である可能性があり、に制限されることなくほとんどのPPL構造を使用できますstructured_task_group

于 2013-12-23T19:39:07.613 に答える