【问题标题】:How do I use the new C++17 execution policies? [duplicate]如何使用新的 C++17 执行策略? [复制]
【发布时间】:2017-07-22 22:06:38
【问题描述】:

我正在阅读cppreference.com 上的std::algorithm 文档,我注意到很多我还没有使用过的很酷的东西上有一个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 &lt;execution&gt;,但它显示execution: No such file or directory。我也尝试过#include&lt;experimental/algorithm&gt; 而不是#include&lt;algorithm&gt;,但我得到了相同的结果。如何使用此新功能?

【问题讨论】:

  • 验证您的 g++ 是否支持此功能。 C++17 甚至还没有正式完成,很可能还需要几个月的时间。
  • libstdc++还不支持这个功能,看P0024R2的状态是“no”:gcc.gnu.org/onlinedocs/libstdc++/manual/…
  • @underscore_d 重复关闭原因的帮助文本接近于“此问题已在...中得到解答”。 Q 不一定相同。您应该回答旧问题并然后将此问题作为重复项关闭。
  • (这是一个非特定的想法;我同意这是重复的)

标签: c++ multithreading algorithm c++17


【解决方案1】:

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

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

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

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

【讨论】:

  • 在任何支持它的前沿版本上是否有任何编译器?我在主干和 gcc 7 上尝试了 clang。
  • -std=c++17 的意思是“给我你已经完成的所有 C++17”,而不是“成为一个完全有效的 C++17 编译器”。我以为这就是-std=c++1z 的用途?我错过了什么?
  • @cassio 1z 适用于 C++17 完成之前;它可能会完全实现标准中更改或删除的内容等。 17 是标准完成时,但您的支持可能不完整。或者换句话说,MSVC 刚刚在他们的上一个补丁中完成了对 C++11 的支持(忽略错误)
【解决方案2】:

据我了解cppreference 此功能在文档 P0024R2 中定义,目前尚不支持任何编译器。

【讨论】:

    【解决方案3】:

    如果您使用的是 g++,那么您可以尝试非标准扩展:

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

    【讨论】:

      【解决方案4】:

      对于 Microsoft 编译器:请参阅 C++17 Progress in VS 2017 15.5 and 15.6 您将在哪里找到:

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

      对于 GCC,正如Fanael 在他的comment 中所写,请参阅表 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-06
        • 1970-01-01
        • 2021-10-26
        • 2020-10-17
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 2012-08-13
        相关资源
        最近更新 更多