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 求平方和):
#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<>{}); // 并行+向量化求和
关键点:
;par 和 par_unseq 会自动退化为顺序执行,不会报错;std::find_if 在部分旧实现中)会编译失败,需查文档确认。并行 ≠ 自动加速,用错策略反而更慢甚至出错:
std::cout 、malloc);
std::transform 中后项依赖前项结果,par_unseq 可能乱序执行导致错误;par,> 数万再试 par_unseq;seq:行为确定、便于断点追踪;上线前再切换策略并压测。标准不提供运行时检测接口,但可通过以下方式验证:
htop 或任务管理器观察 CPU 核心占用率是否多核飙升;std::mutex 或原子计数器);std::chrono::steady_clock 的耗时变化;TBB_NUM_THREADS=1)强制限制线程数,可用于隔离测试。