как выйти из std :: execution :: par_unseq l oop на основе условия - PullRequest
2 голосов
/ 06 мая 2020

Мне нужно выйти из l oop, если один из моих элементов очереди удовлетворяет условию. размещение break приводит к ошибке компиляции. как лучше всего выполнить l oop parallel

// code

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;
    }
});

1 Ответ

0 голосов
/ 06 мая 2020

Я почти уверен, что это не сработает. Зачем? потому что break - это статическая операция; то есть место назначения для break определяется во время компиляции. Помещение его в лямбду (с l oop внешним по отношению к лямбде) делает невозможным для компилятора видеть, где «перейти к».

Пример без параллелизма:

    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 в параллельном алгоритме. В непараллельном случае вы можете создать исключение, но в параллельном случае это не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...