惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
WordPress大学
WordPress大学
MyScale Blog
MyScale Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Blog of Author Tim Ferriss
U
Unit 42
罗磊的独立博客
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
aimingoo的专栏
aimingoo的专栏
Vercel News
Vercel News
N
Netflix TechBlog - Medium
H
Hackread – Cybersecurity News, Data Breaches, AI and More
云风的 BLOG
云风的 BLOG
Hugging Face - Blog
Hugging Face - Blog
大猫的无限游戏
大猫的无限游戏
F
Fortinet All Blogs
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
博客园 - 【当耐特】
H
Help Net Security
The GitHub Blog
The GitHub Blog

C++

小孩马上高一,但是想学信奥赛 c++,有什么学 c++的书推荐? 真是意想不到的操作:有好几个人一起协作向 C++库 fmtlib 加上了 C11 包装接口,确实能用 基于 C++20 协程编写 gRPC 客户端与服务端 似乎在 C 的领域,让一个新程序“为未来准备好”是一件很麻烦的事 请教各位 centos 7.9 通过 devtoolset 启用 c++14/17 时遇到的链接问题 求大佬指点:Windows 上 c++部署最新 Paddleocr,无法通过内存识字 为 c++ 提供模式匹配 分享一下我个人开源的 C++23 协程网络框架 为什么写 C++的人年龄偏大? 大型 c++项目,在 ai 帮助下完成 Linux 平台移植,可行性多大? 少用 auto 再一次感觉到 C++的恶心 分布式存储 [求助] Linux 有什么好的引入 c++ 第三方库的方案 2026 年找 C++的开发工作,应该学习 C++的哪个版本? 分布式系统 使用匿名结构体指针作为常量来杜绝魔数,是否合理/值得? 有没有什么工具可以统计 C++项目里标识符的使用情况? 看到一些 C++ 或者 C#项目 驼峰和下划线一块用,为啥泥? [求助] Linux 系统下动态库卸载后全局变量未重置的问题 交叉编译 asop android adb 最新版的问题 [有偿] 小白, Windows UI Automation TextPattern 检测问题求助 小白问个 vcpkg 相关的问题 记录一次踩坑过程(clion + cmake + vcpkg) 用智能指针管理 ffmpeg 中的数据结构是有必要的吗? 定位重载的插件或者 IDE 想系统的学习 Modern C++,麻烦大佬们推荐一些书籍 困扰几天的问题,这是被 gcc 优化了吗? 好的 c++代码是什么样的 为什么 C/C++ 语言的标准库不做成 Java 那样可安装的运行时?
[求助]请教一个 C++多线程的性能问题
Ainokiseki · 2025-11-12 · via C++

LZ 受命使用多线程提高某个程序的运行效率。原来程序的行为大概是 step0,step1,step2 之后回到 step0 ,循环若干次。LZ 把 step1 和 step2 的一部分流程并行化,开了三个后台线程做消费者,主线程把任务放在队列里面,消费者线程拿取之后运行,运行完毕后主线程继续。代码如下:
```
std::vector>futures;
for(auto npg:m_NPGs){
futures.emplace_back(ThreadPoolSingleton::getNPCInstance(threadNum.getValue()).enqueue([this,npg]() {
npg->cycleStep1();
}));
}
for(auto &k:futures){
k.wait();
}
```
线程池代码如下:
```
inline ThreadPool::ThreadPool(size_t threads)
: stop(false)
{
for(size_t i = 0;iworkers.emplace_back(
[this]
{
for(;;)
{
std::function task;
{
std::unique_lock lock(this->queue_mutex);
this->condition.wait(lock,
[this]{ return this->stop || !this->tasks.empty(); });
if(this->stop && this->tasks.empty())
return;
task = std::move(this->tasks.front());
this->tasks.pop();
}
task();
}
}
);
}
```
然而出乎楼主预料的是,使用多线程之后性能不增反降,进一步分析发现没有使用多线程优化的 step0 的用时相较之前有着明显增加,幅度达到了单线程时的两倍。火焰图上看,step0 期间调用的每个函数用时增长幅度大致相当。
单线程时,用时分别为:t0=2s, t1=5.58s, t2=10s 多线程时,用时为:t0=3.97s t1=9.3s t2=10.4s
楼主现在不理解的是,step0 看起来和我的多线程优化没有任何关系,在 step0 运行时,三个后台线程应该都在被 condition_variable 阻塞。为什么用时会增加呢?
楼主运行环境为多人共用的 linux 服务器,100 多个空闲核心,开三个后台线程应该不会有什么影响。