std::transform 或 std::generate 在没有 ExecutionPolicy 的情况下是否可以并
Can std::transform or std::generate without ExecutionPolicy be parallel?
在C++17中引入了并行std算法(使用ExecutionPolicy参数重载(,其中定义了严格的执行顺序,交错和平行化规则,例如([algorithm.parallel.exec/3](:
并行算法中元素访问函数的调用,执行策略对象为 类型执行::sequenced_policy都发生在执行的调用线程中。[ 注意:调用不是交错的;见 4.6。
(当前草案中也是如此(
问题是我找不到对这些算法的旧的非并行重载的任何此类要求。
问题:这是否意味着库实现者可以从引入执行术语线程的 C++11 开始,使用 SIMD/多线程/其他(?( 实现 std::transform 和 std::generate ?这有什么原因吗?
[res.on.data.races]/8 除非另有说明,否则C++标准库函数应仅在当前线程内执行所有操作,前提是这些操作对用户可见 (4.7( 的效果。
这排除了接触任何用户定义实体的任何类型的幕后多线程。
我想,原则上,像std::sort
在vector<int>
上工作这样的事情可以证明不涉及用户定义的类,并将工作发送到多个线程。这是相当牵强的,很难想象在实践中有任何实现这样做。
相关文章:
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 为什么在以下情况下我需要使用 std::d ecay?
- 如何在没有 std::move 的情况下移动临时对象
- 在不使用模板的情况下获取 std::array 引用
- 如何在不使用 std::tm 和 mktime() 的情况下为给定日历日期创建 chrono::time_point 对
- 如何在给定 std::variant 的情况下检索模板参数包?
- 有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?
- 在不使用vector.end()的情况下迭代std::vector
- 为什么std::atomic中的所有成员函数都同时出现在有volatile和没有volatile的情况下
- 如何从 std::optional 中获取 QByteArray<QByteArray>,并在没有其他 malloc 的情况下保留 std::nullopt?
- 默认情况下,"std::shared_ptr"不应该使用"std::d efault_delete"吗?
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 在运行时,何时完全初始化 std 库才能在不破坏代码的情况下使用它?
- 如何在没有迭代器的情况下使用 std::for_each + std::execution::p ar?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- std::regex 是否保证了最坏情况下的时间复杂度?