讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ std::execution并行算法 _ C++17多线程优化sort【干货】

小磊吖_6064

小磊吖_6064

发布时间:2026-04-11 15:11:16

|

640人浏览过

|

来源于php中文网

原创

std::execution::par 未加速主因是环境、数据、策略不匹配:libstdc++需-link OpenMP,libc++不支持,MSVC需/qpar;数据量<50万基本无效;须用-O2、-pthread/-fopenmp编译并验证多线程执行。

c++ std::execution并行算法 _ c++17多线程优化sort【干货】

直接上 std::sort(std::execution::par, begin, end) 几乎肯定不会变快,大概率还是串行跑——不是你写错了,是环境、数据、策略三者没对齐。

为什么 std::execution::par 调用 sort 后 CPU 占用没升、耗时没降?

这不是 bug,是标准库实现的现实约束。多数 libstdc++(GCC)默认不启用并行后端,除非你显式链接 OpenMP 或 pthread;libc++(Clang)截至 2026 年 4 月仍完全不支持 std::execution::par;MSVC 虽支持,但也得开 /qpar 且仅限部分算法。

  • 运行前先检查:std::thread::hardware_concurrency() 返回 0 或 1,就别试了
  • 编译必须带 -pthread(Linux/macOS)或启用并发运行时(Windows),GCC 还得加 -fopenmp 才可能触发线程池
  • Debug 模式下,libstdc++ 会静默降级为 seq,务必用 -O2 以上测试
  • 用 htop 或任务管理器观察:若只有单核持续满载,说明并行根本没走通

什么规模的数据才值得用 par 或 par_unseq?

小于 10⁵ 元素的 std::sort 基本白搭——线程启动+分块+归并的开销远超收益。实测中,只有当 v.size() >= 500000 且元素是自定义类型(含字符串、指针、深拷贝逻辑)时,par 才开始显现加速比。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • par_unseq 对 sort 不仅无效,还可能崩溃:它要求比较操作无副作用、无全局状态、可乱序执行,而 std::sort 内部有强顺序依赖
  • 真正适合 par_unseq 的是 std::transform、std::reduce 这类纯函数式操作
  • 随机访问迭代器是硬门槛:std::vector 可以,std::list 或 std::deque 直接编译失败

怎么写才能让并行 sort 真正跑起来?

别只改一行代码。真实生效需要三步联动:数据准备 + 编译配置 + 运行时验证。

立即学习“C++免费学习笔记(深入)”;

  • 数据预热:确保 v 是连续内存(std::vector),且 v.capacity() == v.size(),避免重分配干扰
  • 编译命令示例(GCC):g++ -std=c++17 -O2 -pthread -fopenmp sort.cpp -o sort
  • 加个最小验证逻辑:auto start = std::chrono::steady_clock::now(); std::sort(std::execution::par, v.begin(), v.end()); auto end = std::chrono::steady_clock::now();,再对比 seq 版本耗时
  • 输出线程 ID 验证(仅调试):std::for_each(std::execution::par, v.begin(), v.end(), [](int&) { std::cout << std::this_thread::get_id() << '\n'; });,去重后应 ≥2

最容易被忽略的坑:内存分配和数据竞争

并行 sort 内部会频繁申请临时缓冲区,若用默认 new,多线程争抢堆锁会吃掉一半性能。更隐蔽的是:lambda 里捕获非 const 引用、调用非 const 成员函数、甚至用 std::cout,都会导致未定义行为。

  • 避免在排序期间修改容器本身(如 push_back、erase),否则迭代器失效风险翻倍
  • 不要在 std::sort 的比较函数里读写共享变量,哪怕加了 std::atomic,也破坏算法语义
  • 考虑用内存池预分配:对千万级数据,std::sort 配合自定义分配器可提升 30% 吞吐量
  • par_unseq 下连 std::sqrt 都可能出问题——某些 libc 实现的数学函数非 reentrant,得换 std::sqrtf 或查表

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1138

2023.09.04

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2138

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1698

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2604

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6024

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5529

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7214

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

10374

2024.04.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

0

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn