gpt4 book ai didi

c++ - 标准算法的并行实现和副作用

转载 作者:可可西里 更新时间:2023-11-01 17:54:47 26 4
gpt4 key购买 nike

通过 std::transform 的标准文档,我注意到在 C++11 之前,仿函数参数被要求没有副作用,而从 C++11 开始,要求有限制较少 - “op 和 binary_op 不得使迭代器或子范围无效,或修改范围中的元素”。见

http://en.cppreference.com/w/cpp/algorithm/transform

和标准的第 25.3.4 节。 cppreference.com 上的网页也提到“这些要求的目的是允许 std::transform 的并行或无序实现”。

我不明白这段代码在 C++11 中是否合法:

std::vector<int> v(/* fill it with something */), v_transformed;
int foo = 0;
std::transform(v.begin(),v.end(),std::back_inserter(v_transformed),[&foo](const int &n) -> int {
foo += 1;
return n*2;
});

显然,如果 std::transform 在后台并行化,我们将有多个并发调用 foo += 1,这将是 UB。但是仿函数本身似乎并没有违反标准中概述的要求。

这个问题可以问其他标准算法(除了我认为 std::for_each,它明确声明迭代是按顺序执行的)。

我是不是误会了什么?

最佳答案

据我了解 C++11 规范,所有标准库函数都必须按顺序执行所有操作,前提是它们的效果对用户可见。特别是,所有“变异序列操作”都必须按顺序执行。

标准的相关部分是 §17.6.5.9/8:

Unless otherwise specified, C++ standard library functions shall perform all operations solely within the current thread if those operations have effects that are visible (1.10) to users.

关于c++ - 标准算法的并行实现和副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20119810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com