是否有 tbb::p arallel_for 的中断命令
Is there a break command for tbb::parallel_for
你怎么能从tbb::paralel_for
中break
出来,类似于顺序for
?
也许你可以抛出一个专门的异常。TBB 运行时应在运行特定任务的线程中捕获异常,导致任务组被取消,并从取消组的根重新抛出异常。
可以引发异常,也可以使用取消 API。在后一种情况下,break;
的"替代品"是tbb::task::self().cancel_group_execution(); return;
.但是,两者都不能保证串行循环中的break
。更确切地说,(在串行意义上)取消/异常之后的任何循环迭代可能仍由其他线程执行;此外,取消/异常之前(在串行意义上)的某些迭代可能永远不会运行。
如果tbb::parallel_for
体内部有一个循环(例如,迭代blocked_range
的循环),你可以考虑在true
的情况下打破tbb::task::self().is_cancelled()
循环;这可能会减少浪费的工作并更快地完成循环。
有关更多详细信息,您可以查看TBB文档,例如 https://www.threadingbuildingblocks.org/docs/help/tbb_userguide/Exceptions_and_Cancellation.html 和 https://www.threadingbuildingblocks.org/docs/help/reference/task_scheduler/cancellation.html。
如果在串行代码中使用break
来查找满足条件的"最左边"点(例如最小循环索引或容器中的第一项),则不应使用取消或异常,因为结果可能不正确。相反,使用一种减少形式(例如tbb::parallel_reduce
) 选择所有合适点中的"最左边"一个。一种可能的优化是使用原子变量(在循环外部指定)来保留最小合适的索引,并跳过具有较大索引的所有迭代。要更新原子变量,您需要使用compare_and_swap
操作来检查另一个线程是否可能使用比当前线程找到的值更小的值更新它。
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何在C++中从两个单独的for循环中添加两个数组
- 在Linux for Windows上编译C++代码时出错
- 调用专用模板时出错"no matching function for call to [...]"
- 为什么我的for循环不能正确获取argv
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 螺旋矩阵在最后一个"for"循环中中断,不显示任何内容
- 我的 break 语句没有中断 for 循环
- 如何在输入整数时中断 for 循环
- 在 for 循环中使用中断
- 如何仅针对此特定值中断 for 循环
- OpenCV/ c++ for循环不会中断
- 一次执行后,嵌套for循环出现意外/未见的中断:高斯消去
- c++在几个for循环中中断
- C++for循环逻辑:从cmdline参数中获取字符串后中断
- 如何中断for循环