没有ExecutionPolicy的std :: transform或std :: generate可以并行吗?

时间:2018-01-08 15:47:53

标签: c++ c++11 language-lawyer c++17

在C ++中引入了17个并行std算法(使用ExecutionPolicy参数重载),其中定义了严格的执行顺序,交错和并行化规则,例如([algorithm.parallel.exec / 3]):

  

用执行策略对象调用的并行算法中元素访问函数的调用   type execution :: sequenced_policy都出现在执行的调用线程中。 [注意:调用不是交错的;见4.6。 - 结束说明]

current draft中的相同内容)

问题在于我找不到这些算法的旧的非并行重载的任何此类要求。

问题:这是否意味着库实现者可以自从C ++ 11引入执行线程术语时实现std :: transform和std :: generate使用SIMD /多线程/其他(?)?这有什么理由吗?

1 个答案:

答案 0 :(得分:3)

  

[res.on.data.races]/8除非另有说明,否则C ++标准库函数应仅在当前线程内执行所有操作,如果这些操作具有对用户可见的效果(4.7)。

这排除了触及任何用户定义实体的任何类型的幕后多线程。

我认为,原则上,像std::sort这样的vector<int>工作可以证明不涉及用户定义的类,并将工作发送到多个线程。这是相当牵强的,很难想象在实践中这样做的任何实现。