
std::execution 是 C++17 引入的一组执行策略(execution policies),用于显式控制标准库并行算法(如 std::sort、std::transform、std::reduce 等)的执行方式。它不是“策略模式”的设计模式实现,而是一组轻量级的标记类型(tag types),供算法在调用时声明期望的并发行为。
std::execution 提供的三种执行策略
目前标准定义了三个策略对象(C++17 起,C++20 增加了 unseq 的变体但未改变核心):
-
std::execution::seq:顺序执行(sequential)——禁止任何并行或向量化,等价于不传策略的传统调用; -
std::execution::par:并行执行(parallel)——允许算法在多个线程上划分任务,但不保证数据竞争安全(需用户确保无共享可变状态); -
std::execution::par_unseq:并行+向量化(parallel + unsequenced)——既允许多线程,也允许编译器对循环内操作自动向量化(如 SIMD),对迭代器解引用和函数调用顺序不做保证(要求函数为无副作用、幂等)。
怎么用?基本调用形式
所有支持执行策略的算法都重载了一个接受 ExecutionPolicy&& 作为首个参数的版本:
std::vector<int> v = {/* ... */};
std::sort(std::execution::par, v.begin(), v.end()); // 并行排序
std::transform(std::execution::par_unseq,
v.cbegin(), v.cend(),
v.begin(),
[](int x) { return x * x; }); // 并行+向量化平方
登录后复制
注意:
– 必须显式包含 <execution></execution> 头文件;
– 编译器需开启对应支持(如 GCC/Clang 需 -pthread,部分需 -D_GLIBCXX_PARALLEL 或启用 libstdc++ 并行模式);
– 不是所有标准库实现都完整支持全部策略(例如 MSVC 对 par_unseq 支持有限)。
关键注意事项和常见误区
这些策略不改变算法语义,但极大影响线程安全与性能边界:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~