使用 std::back_inserter 的并行执行策略安全吗?

men*_*oom 2 c++ c++17

我想知道当输出为 时,使用执行策略std::execution::par和是否安全。例如:std::execution::par_unseqstd::back_insert_iterator

std::vector<std::string> src(100, "test"), dst;
std::move(std::execution::par_unseq, src.begin(), src.end(), std::back_inserter(dst));
Run Code Online (Sandbox Code Playgroud)

是否保证不会对目标向量进行并发插入?

Yak*_*ont 9

调用push_backa与或std::vector的要求不匹配。par_unseqpar

所以不,它不安全。

通过说par您承诺对用于输入和输出的迭代器的访问不包含竞争条件。这里失败了。

par_unseq需要你更多的承诺;基本上,你们都没有数据竞争,并且你们的算法适合矢量化(批量处理)。

push_back不符合条件,并且back_inserter是根据 定义的push_back

另一方面:

std::vector<std::string> src(100, "test"), dst(100, "");
std::move(std::execution::par_unseq, src.begin(), src.end(), dst.begin());
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为您可以并行并同时访问 a 的各个元素vector(除了vector<bool>