web-dev-qa-db-de.com

Wie verwende ich die neuen Ausführungsrichtlinien für C++ 17?

Ich las die Datei std :: algorithm documentation bei cppreference.com durch und bemerkte ein C++ 17 - Tag auf vielen coolen Dingen, die ich noch nicht verwendet habe. Was mir am meisten auffiel, waren die neuen Ausführungsrichtlinien. Was ich aus dem Lesen über sie herausgefunden habe, ist, dass ich jede for_each Schleife machen kann, die ich Multithreading möchte, indem ich einfach eine Ausführungsrichtlinie spezifiziere.

Ich habe zum Beispiel ein Programm, das ein Bild mit einer 2D-Grafik ausgibt.

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

Wenn ich dieses Programm multithreaded machen möchte, sollte ich es mit einer Zeile machen können.

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

Als ich dies jedoch zum ersten Mal ausprobierte (mit g++ -std=c++17), bekam ich einen Fehler, der mir sagte, dass ‘std::execution’ has not been declared, also versuchte ich #include <execution> hinzuzufügen, aber es heißt execution: No such file or directory. Ich habe auch #include<experimental/algorithm> anstelle von #include<algorithm> versucht, aber ich erhalte das gleiche Ergebnis. Wie verwende ich diese neue Funktion?

14
Willy Goat

c ++ 17 wurde noch nicht abgeschlossen. Und verschiedene Compiler haben es noch nicht vollständig implementiert.

-std=c++17 bedeutet "gib mir alles von C++ 17, das du beendet hast", nicht "ein perfekt gültiger C++ 17-Compiler".

Diese Funktion wird zu diesem Zeitpunkt von Ihrem Compiler und/oder Ihrer Standardbibliothek nicht unterstützt. Schauen Sie sich in ein paar Wochen/Monaten/Jahren wieder an.

Es gibt kein allgemein akzeptiertes "Bitte geben Sie mir C++ 17, wenn Sie es vollständig unterstützen. Andernfalls geben Sie mir ein Fehler" -Flag, das Sie an einen Compiler übergeben können. teils weil es wenig praktisch ist. Wenn die von C++ 17 bereitgestellte Teilmenge ausreicht, gewinnen Sie. Wenn Sie einen vollständig kompatiblen Compiler benötigen, wissen bestimmte Versionen von Compilern nicht, ob sie Fehler enthalten. Daher können Sie dem Flag ohnehin nicht vertrauen und müssten es mit Compilerversionen testen. Und wenn Sie bereits wissen, welche Versionen des Compilers über ausreichend gültiges C++ 17 verfügen, benötigen Sie kein Flag, um es Ihnen mitzuteilen.

Soweit ich unter cppreference .__ verstehe, ist diese Funktion in document P0024R2 definiert und wird von keinem Compiler unterstützt.

1

Für Microsoft-Compiler: siehe C++ 17 Fortschritt in VS 2017 15.5 und 15.6 wo Sie Folgendes finden:

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

Für GCC, als Fanael schrieb in seinen Kommentar , siehe Tabelle 1.5. C++ 2017-Implementierungsstatus unter https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017 wo Sie finden

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

Wenn Sie g ++ verwenden, können Sie die nicht standardmäßige Erweiterung ausprobieren:

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

0
sashang