C++17标准在STL中新增了并行算法支持,通过在原有算法接口中添加执行策略参数,让开发者可以轻松将串行算法转换为并行执行,充分利用多核处理器的计算能力,减少复杂任务的执行时间。

并行STL的核心:执行策略
并行STL的所有并行能力都围绕执行策略展开,执行策略定义在<execution>头文件中,主要分为三类,不同策略对应不同的执行方式:
- std::execution::seq:顺序执行策略,算法按传统串行方式执行,不使用并行,是默认的执行策略。
- std::execution::par:并行执行策略,算法会在多个线程上并行执行,具体线程数由标准库实现决定。
- std::execution::par_unseq:并行加向量化执行策略,算法不仅并行执行,还可能使用SIMD等向量化指令优化,执行效率最高,但对代码的要求也更严格。
基础使用示例
使用并行STL首先需要包含对应的头文件,除了算法本身的头文件,还需要包含<execution>头文件获取执行策略。下面通过几个常见场景演示并行算法的使用。
并行排序
对大规模数组排序时,使用并行版本的std::sort可以显著提升速度,只需要传入执行策略作为第一个参数即可:
#include <algorithm>
#include <execution>
#include <vector>
#include <iostream>
int main() {
// 创建包含100万个随机数的数组
std::vector<int> nums(1000000);
for (int i = 0; i < nums.size(); ++i) {
nums[i] = rand() % 10000;
}
// 使用并行策略排序
std::sort(std::execution::par, nums.begin(), nums.end());
// 验证排序结果
bool is_sorted = std::is_sorted(std::execution::seq, nums.begin(), nums.end());
std::cout << "排序结果是否正确:" << (is_sorted ? "是" : "否") << std::endl;
return 0;
}
并行遍历处理
对容器中的每个元素执行相同操作时,可以使用std::for_each的并行版本,比如下面的例子给每个元素加1:
#include <algorithm>
#include <execution>
#include <vector>
#include <iostream>
int main() {
std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 并行遍历每个元素,执行加1操作
std::for_each(std::execution::par, data.begin(), data.end(), [](int& val) {
val += 1;
});
// 输出结果
for (int val : data) {
std::cout << val << " ";
}
std::cout << std::endl;
return 0;
}
并行归约计算
计算容器中所有元素的和这类归约操作,使用并行版本的std::reduce可以提升计算效率,相比std::accumulate,std::reduce支持并行执行:
#include <numeric>
#include <execution>
#include <vector>
#include <iostream>
int main() {
std::vector<int> nums(1000000, 1); // 100万个1
// 并行计算总和
int sum = std::reduce(std::execution::par, nums.begin(), nums.end(), 0);
std::cout << "总和:" << sum << std::endl;
return 0;
}
使用注意事项
虽然并行STL使用简单,但在实际使用时需要注意以下几点,避免出现逻辑错误或者性能问题:
- 操作必须是线程安全的,如果lambda表达式中修改了共享的外部变量,需要自己添加互斥锁等同步机制,否则会出现数据竞争。
- 并行算法有额外的调度开销,如果处理的数据量很小,并行带来的收益可能抵不上开销,反而会让程序变慢,建议只在数据量大的场景下使用。
- 使用par_unseq策略时,操作不能有任何副作用,也不能抛出异常,否则会导致未定义行为。
- 不是所有STL算法都支持并行执行,使用前可以查阅标准库文档确认对应算法是否支持执行策略参数。
执行策略选择建议
在实际开发中可以参考以下规则选择执行策略:
| 场景 | 推荐执行策略 |
|---|---|
| 数据量小,或者操作有顺序依赖 | std::execution::seq |
| 数据量大,操作无共享状态修改,普通并行即可 | std::execution::par |
| 数据量大,操作无副作用,追求极致性能 | std::execution::par_unseq |
通过合理选择执行策略,并行STL可以在不增加太多代码复杂度的情况下,有效提升C++程序的执行效率,是优化计算密集型任务的实用工具。
C++并行算法并行STLexecution_policy修改时间:2026-07-10 01:21:32