在C ++中引入了17个并行std算法(使用ExecutionPolicy参数重载),其中定义了严格的执行顺序,交错和并行化规则,例如([algorithm.parallel.exec / 3]):
用执行策略对象调用的并行算法中元素访问函数的调用 type execution :: sequenced_policy都出现在执行的调用线程中。 [注意:调用不是交错的;见4.6。 - 结束说明]
(current draft中的相同内容)
问题在于我找不到这些算法的旧的非并行重载的任何此类要求。
问题:这是否意味着库实现者可以自从C ++ 11引入执行线程术语时实现std :: transform和std :: generate使用SIMD /多线程/其他(?)?这有什么理由吗?
答案 0 :(得分:3)
[res.on.data.races]/8除非另有说明,否则C ++标准库函数应仅在当前线程内执行所有操作,如果这些操作具有对用户可见的效果(4.7)。
这排除了触及任何用户定义实体的任何类型的幕后多线程。
我认为,原则上,像std::sort
这样的vector<int>
工作可以证明不涉及用户定义的类,并将工作发送到多个线程。这是相当牵强的,很难想象在实践中这样做的任何实现。