
std::execution 是 C++17 引入的一组执行策略(execution policies),用于显式控制标准库并行算法(如 std::sort、std::transform、std::reduce 等)的执行方式——是顺序执行、并行执行,还是并行加向量化(即“向量化并行”)。它不改变算法逻辑,只影响底层如何调度和执行迭代操作。
三种标准执行策略及其含义
目前标准定义了四个策略(C++17 起三个,C++20 新增一个),全部位于 头文件中:
-
std::execution::seq:强制**顺序执行**,无并发,等价于传统串行算法。适合调试、小数据或有强依赖的场景。 -
std::execution::par:允许**并行执行**(多线程),但不保证向量化。底层通常使用线程池或 std::thread 分发任务。 -
std::execution::par_unseq:允许**并行且非顺序执行**(parallel + unsequenced),即支持多线程 + 单线程内 SIMD 指令(如 AVX)。这是性能潜力最高的策略,但要求算法操作满足无数据竞争、无副作用、可重排等严格条件(例如不能在 lambda 中修改共享变量或调用 printf)。 -
std::execution::unseq(C++20):仅限**单线程内向量化**(unsequenced),不启用多线程,但允许编译器自动向量化循环体。适用于对线程安全敏感但又想榨干单核性能的场合。
怎么用:并行算法调用示例
使用方式统一:把执行策略作为**第一个参数**传给支持的算法函数。注意:不是所有算法都支持;仅 C++17 及以后的标准库实现(如 libstdc++ 9+、libc++ 7+、MSVC 2019+)提供完整支持。
示例(对 vector 求平方和):
立即学习“C++免费学习笔记(深入)”;
#include#include #include std::vector v(1000000, 2.0); double sum = std::reduce(std::execution::par_unseq, v.begin(), v.end(), 0.0, std::plus<>{}); // 并行+向量化求和
关键点:
- 必须显式包含
; - 策略对象不可复制或存储(是空类型,仅作标记);
- 若运行时系统不支持(如线程数为 1 或未启用 OpenMP),
par和par_unseq会自动退化为顺序执行,不会报错; - 不支持策略的算法(如
std::find_if在部分旧实现中)会编译失败,需查文档确认。
注意事项与常见陷阱
并行 ≠ 自动加速,用错策略反而更慢甚至出错:
-
不要在 lambda 中访问/修改共享状态:比如捕获外部变量并 ++,或调用非线程安全函数(
std::cout 、malloc); -
避免数据依赖:如
std::transform中后项依赖前项结果,par_unseq可能乱序执行导致错误; -
小容器慎用并行:启动线程/向量化的开销可能远超计算收益;一般建议元素数 > 数千才考虑
par,> 数万再试par_unseq; -
调试时优先用
seq:行为确定、便于断点追踪;上线前再切换策略并压测。
如何判断是否真正并行了?
标准不提供运行时检测接口,但可通过以下方式验证:










