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

Mic*_*Łoś 6 c++ language-lawyer c++11 c++17

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

使用类型为execute :: sequenced_policy的执行策略对象调用的并行算法中的元素访问函数的调用都发生在执行的调用线程中.[注意:调用不是交错的; 见4.6. - 结束说明]

(目前草案中的情况相同)

问题是我找不到这些算法的旧的非并行重载的任何这样的要求.

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

Igo*_*nik 3

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

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

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