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函数将执行 lambda 和cancellation_token. 在 lambda 内部,

链接:run_with_cancellation_token 函数

可以在 MSDN 上找到代码示例:How to: Use Cancellation to Break from a Parallel Loop

我不能说这种方法的“效率”,因为我怀疑 C++ 异常参与了它的实现。但是,此代码可能比其他方法更简单,并且它允许使用大多数 PPL 结构,而不仅限于structured_task_group.

于 2013-12-23T19:39:07.613 回答