是否实现了 std::copy 以使用多个线程?

Posted

技术标签:

【中文标题】是否实现了 std::copy 以使用多个线程?【英文标题】:Is std::copy implemented to use multiple threads? 【发布时间】:2020-03-16 10:41:11 【问题描述】:

我想尽快将一个向量复制到另一个向量中。

一种方法是使用std::copy

std::copy(other_vector().begin(),other_vector().end(),this_vector.begin());

但由于向量很长,我想知道 std::copy 函数是否已实现,因此它会使用多个线程。

我可以提供一个自定义逻辑来将向量分成相等的分离部分,分别复制项目,但我不想再次重新发明***。

那么std::copy 是否适用于多线程?

【问题讨论】:

你需要两个向量吗?如果没有,则使用指向向量的指针并滑动而不是复制 我假设 this 是一些变量名(this 关键字在这里似乎不合适) 是的,谢谢我更新了代码以反映这一点。我将需要这两个向量。 【参考方案1】:

你很幸运从 C++17 得到了

template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 copy( ExecutionPolicy&& policy, ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first );

见https://en.cppreference.com/w/cpp/algorithm/copy

【讨论】:

所以如果我理解正确的话,它在 c++17 之前的实现中并不是并行的,但是我可以指定我想要它吗? 是的,这是正确的,根据您的供应商实施指定您的 ExecutionPolicy。【参考方案2】:

不,您在问题中显示的std::copy 重载通常不能实现并行执行,因为它被指定按从头到尾的顺序依次复制元素。它可能永远不会在任何情况下实现并行执行。

自 C++17 以来,标准库算法有并行扩展,它采用额外的第一个参数指定 执行策略,假设标准库以这种方式实现它,它可以是并行的,例如(需要#include&lt;execution&gt;):

std::copy(std::execution::par, other_vector().begin(), other_vector().end(), this_vector.begin());

有关执行策略的不同选项及其具体含义,请参阅cppreference.com。

这还没有在所有编译器/标准库中完全实现,可能需要额外的编译器选项。请参阅cppreference.com's compiler support table 中的“并行 TS 标准化”。

【讨论】:

以上是关于是否实现了 std::copy 以使用多个线程?的主要内容,如果未能解决你的问题,请参考以下文章

XPC 连接如何以线程方式处理?

使用 std::copy 时出错

空范围的 std::copy() 或 std::move() 是不是需要有效目的地?

在结构数组上使用 c++ std::copy

使用 std::copy 复制数组时出现分段错误

为啥在 std::copy 期间使用 std::back_inserter 而不是 end()?