it-roy-ru.com

Как использовать новые политики выполнения C++ 17?

Я читал документацию std :: алгоритма на cppreference.com и заметил тег C++ 17 на многих интересных вещах, которые я еще не использовал. Больше всего меня привлекло новые правила исполнения. Из того, что я прочитал о них, я узнал, что я могу сделать любой цикл for_each, который я хочу, многопоточным, просто указав политику выполнения.

Например, у меня есть программа, которая выводит изображение с 2D-графикой на нем.

int main(){
    std::for_each(
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

Если я хочу сделать эту программу многопоточной, я смогу сделать это одной строкой.

int main(){
    std::for_each(
        std::execution::par_unseq, // c++17 feature
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

Однако, когда я впервые попробовал это (с g++ -std=c++17), я получил ошибку, сообщающую мне, что ‘std::execution’ has not been declared, поэтому я попытался добавить #include <execution>, но он говорит execution: No such file or directory. Я также пробовал #include<experimental/algorithm> вместо #include<algorithm>, но получаю тот же результат. Как мне использовать эту новую функцию?

14
Willy Goat

c ++ 17 еще не завершена. И различные компиляторы еще не полностью реализовали это.

-std=c++17 означает «дай мне весь C++ 17, который ты закончил», а не «будь совершенно корректным компилятором C++ 17».

На данный момент эта функция не поддерживается вашим компилятором и/или стандартной библиотекой. Перепроверьте через несколько недель/месяцев/лет.

Нет общепринятого флага «пожалуйста, дайте мне C++ 17, если вы полностью его поддерживаете, а в противном случае выдайте мне ошибку», который вы можете передать компилятору; частично потому, что это мало практического применения. Если подмножество C++ 17, которое они предоставляют, достаточно, то вы выиграете. И если вам нужен полностью совместимый компилятор, определенные версии компиляторов не знают, есть ли у них ошибки, поэтому вы не можете доверять флагу в любом случае и должны будете проверить его на соответствие версиям компилятора. И если вы уже знаете, какие версии компилятора имеют достаточно допустимый C++ 17, вам не нужен флаг, чтобы сообщить вам об этом.

10
Yakk - Adam Nevraumont

Насколько я понимаю из cppreference Эта функция определена в документе P0024R2 и еще не поддерживается ни одним компилятором.

1
Vladimir Nechaev

Для компилятора Microsoft: см. C++ 17 Progress in VS 2017 15.5 и 15.6 , где вы найдете:

Status  Std   Paper   Title
Partial C++17 P0024R2 Parallel Algorithms

Для GCC, как Fanael написал в своем комментарий , см. Таблица 1.5. Статус реализации C++ 2017 на https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017 где вы найдете

Library Feature                             Proposal    Status
The Parallelism TS Should be Standardized   P0024R2     No
0
Alessandro Jacopson

Если вы используете g ++, вы можете попробовать нестандартное расширение:

https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

0
sashang