c++ - 如何使用新的 C++17 执行策略?

标签 c++ multithreading algorithm c++17

我正在阅读 std::algorithm文档位于 cppreference.com我注意到很多我还没有使用过的很酷的东西上有一个 C++17 标签。最引起我注意的是the new execution policies.我从阅读中收集到的信息是,我可以制作任何 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>但我得到了同样的结果。如何使用此新功能?

最佳答案

尚未最终确定。而且各种编译器还没有完全实现。

-std=c++17 的意思是“给我你已经完成的所有 C++17”,而不是“成为一个完全有效的 C++17 编译器”。

此时您的编译器和/或标准库不支持此功能。几周/几个月/几年后再回来查看。

没有普遍接受的“如果你完全支持,请给我 C++17,否则给我一个错误”标志,你可以传递给编译器;部分原因是它几乎没有实际用途。如果他们提供的 C++17 子集足够,那么你就赢了。如果您需要一个完全兼容的编译器,特定版本的编译器不知道它们是否有错误,因此您无论如何都不能信任该标志,并且必须针对编译器版本对其进行测试。而且,如果您已经知道哪些版本的编译器具有足够有效的 C++17,则不需要标志来告诉您。

关于c++ - 如何使用新的 C++17 执行策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42567998/

相关文章:

algorithm - 在 3D 中找到最大数量的共线点

c - 将代码从 5 位数字转换为 3 个字符

c++ - 如何在没有数组的情况下从文件中读取不同大小行的变量

c++ - 具有多重继承的模糊基数

.net - Console.In.ReadLine(重定向的StdIn)卡住所有其他线程

multithreading - 类级属性或变量是线程安全的

python - 我如何学习算法?

c++ - 在我的C++ Builder应用程序中包括xmmintrin.h的问题

c++ - 从 C++ 到 AS3 : what are fundamental AS3 data structures classes?

c# - 我如何有效地支持项目级和集合级锁定?