Je lisais la documentation std :: algorithm sur (cppreference.com } _ et j'ai remarqué une balise C++ 17 sur beaucoup de choses intéressantes que je n'avais pas encore utilisées. Ce qui a le plus attiré mon attention, c’est les nouvelles règles d’exécution. Ce que j’ai compris à leur sujet, c’est que je peux créer une boucle for_each
que je veux créer en multitâche en spécifiant simplement une règle d’exécution.
Par exemple, j'ai un programme qui sort une image avec un graphique 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;
}
Si je veux rendre ce programme multithread, je devrais pouvoir le faire avec une seule ligne.
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;
}
Cependant, quand j'ai essayé pour la première fois (avec g++ -std=c++17
), j'ai eu une erreur qui me disait que ‘std::execution’ has not been declared
, alors j'ai essayé d'ajouter #include <execution>
mais il y est écrit execution: No such file or directory
. J'ai aussi essayé #include<experimental/algorithm>
au lieu de #include<algorithm>
mais j'obtiens le même résultat. Comment utiliser cette nouvelle fonctionnalité?
c ++ 17 n'était pas encore finalisé. Et divers compilateurs ne l’ont pas encore complètement implémentée.
-std=c++17
signifie "donnez-moi tout le C++ 17 que vous avez terminé" et non "soyez un compilateur C++ 17 parfaitement valide".
Cette fonctionnalité n'est pas prise en charge par votre compilateur et/ou la bibliothèque standard à ce stade. Revenez dans quelques semaines/mois/années.
Il n’existe pas de drapeau généralement accepté "donnez-moi s'il vous plaît C++ 17 si vous le supportez entièrement, sinon donnez-moi une erreur", vous pouvez le transmettre à un compilateur; en partie parce que son utilisation est peu pratique. Si le sous-ensemble de C++ 17 fourni est suffisant, vous gagnez. Et si vous avez besoin d'un compilateur entièrement compatible, certaines versions des compilateurs ne savent pas s'ils ont des bogues, vous ne pouvez donc pas faire confiance au drapeau de toute façon et vous devrez le tester par rapport aux versions du compilateur. Et si vous savez déjà quelles versions du compilateur ont suffisamment de C++ 17 valide, vous n'avez pas besoin d'indicateur pour vous le dire.
D'après ce que j'ai compris de cppreference , Cette fonctionnalité est définie dans le document P0024R2 et elle n'est encore prise en charge par aucun compilateur.
Pour le compilateur Microsoft: voir C++ 17 Progression dans VS 2017 15.5 et 15.6 où vous trouverez:
Status Std Paper Title
Partial C++17 P0024R2 Parallel Algorithms
Pour GCC, Fanael a écrit dans son commentaire , voir Tableau 1.5. État d'implémentation C++ 2017 à https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017 où vous trouverez
Library Feature Proposal Status
The Parallelism TS Should be Standardized P0024R2 No
Si vous utilisez g ++, vous pouvez essayer l'extension non standard:
https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html