首页 > 解决方案 > 如何根据条件退出 std::execution::par_unseq 循环

问题描述

如果我的队列元素之一满足条件,我需要退出循环。放置 break 会导致编译错误。并行执行循环的最佳方法是什么

//代码

std::deque<element> my_elements;

std::for_each(std::execution::par_unseq, my_elements.begin(), my_elements.end(),
    [&](auto v) {

    if (v.attribute == something)
    {
        break;
    }
});

标签: parallel-processingc++17

解决方案


我很确定那行不通。为什么?因为break是一个静态范围的操作;即,目标break是在编译时确定的。将其放入 lambda 中(使用 lambda 外部的循环)使编译器无法查看“中断到”的位置。

没有并行性的示例:

    vector<int> v {1,2,3,4,5,6,7,8,9};
    std::for_each(v.begin(), v.end(),
        [](int i) { cout << i << ' '; if (i == 5) break; });
    cout << endl;

给我以下错误:

so.cpp:10:45: error: 'break' statement not in loop or switch statement
     [](int i) { cout << i << ' '; if (i == 5) break; });

回答你的问题;for_each我不认为有一个很好的方法可以在并行算法中脱颖而出。对于非并行情况,您可以抛出异常,但这在并行情况下不起作用。


推荐阅读