能,htop默认以进程聚合线程资源,需按h键开启线程视图才能看到各线程的tid、cpu%和mem%,其中cpu%为单核占比,mem%为进程共享。

htop 能直接看到线程级 CPU 和内存占用吗
能,但默认不显示——htop 默认以进程为单位聚合线程资源。要定位特定线程(比如某个 std::thread 或 pthread),必须开启线程视图模式,否则看到的只是进程总和,无法区分哪个线程在狂占 CPU。
操作很简单:htop 启动后按 H(大写 H)切换线程视图。此时所有线程会以 TID(线程 ID)为单位展开,父进程名后带 ─┬ 或 ─┘ 层级标识,PID 列实际显示的是 TID。
- 注意:Linux 下线程和进程共享同一个内核调度实体,
gettid()返回的值就是htop中显示的TID - 如果按
H后仍看不到预期线程,可能是该线程已退出,或程序未启用CLONE_THREAD(极少见,通常 C++11std::thread都满足) -
htop不显示线程名(如pthread_setname_np设置的名称),只显示可执行名 + 命令行参数片段
怎么把 C++ 线程 TID 和 htop 里的 TID 对上
关键在获取线程的真实内核 TID,不是 std::thread::id 或 pthread_self() 返回的用户态 handle。
在目标线程里加一段调试输出:
#include <sys> #include <unistd.h> #include <iostream> long tid = syscall(SYS_gettid); std::cout <ul> <li> <code>syscall(SYS_gettid)</code> 是唯一可靠方式;<code>gettid()</code> 是 glibc 封装,某些旧系统可能未暴露</li> <li>不要用 <code>std::this_thread::get_id()</code> —— 它是实现定义的,不能映射到 <code>htop</code> 的 <code>TID</code> 列</li> <li>输出后立刻在 <code>htop</code> 按 <code>F4</code> 输入 <code>TID</code> 数字过滤,或按 <code>F6</code> 选 <code>TID</code> 列排序,快速定位</li> </ul> <h3>为什么 htop 里看到的线程 CPU% 加起来远超 100%</h3> <p>这是正常现象,不是 bug。每个线程的 CPU% 是相对于单个逻辑核心的百分比,不是全局占比。</p> <ul> <li>4 核 CPU 上,一个线程跑满单核显示 <code>100%</code>,4 个线程各占满一核,就显示 4 行 <code>100%</code> </li> <li>若某线程显示 <code>230%</code>,说明它在最近采样周期内跨多个核心调度,且平均占用约 2.3 个逻辑核的算力</li> <li>内存占用(<code>MEM%</code>)才是进程内所有线程共享的,不会重复计算</li> <li>想看整体负载,盯住顶部的 CPU 柱状图,或按 <code>F2 → Display options → Show custom thread names</code>(无实质作用,仅提示)</li> </ul> <h3>定位到线程后,下一步该查什么</h3> <p><code>htop</code> 只是入口,它不告诉你线程在执行哪段代码。拿到高开销线程的 <code>TID</code> 后,必须结合其他工具深入:</p> <ul> <li>用 <code>cat /proc/<tid>/stack</tid></code> 查当前内核栈(需 root 或相同 UID),看是否卡在锁、等待 I/O 或内核态</li> <li>用 <code>perf top -t <tid></tid></code> 实时看用户态热点函数(需编译时带 <code>-g</code>,且无 strip)</li> <li>用 <code>gdb -p <tid></tid></code> 附加后执行 <code>bt</code>,确认调用栈——注意:C++ 异常栈、优化后的内联可能让结果难读</li> <li>避免直接杀线程:<code>kill -9 <tid></tid></code> 可能破坏进程状态,优先用程序内信号或条件变量控制</li> </ul> <p>线程 TID 在进程生命周期内有效,但 <code>htop</code> 刷新间隔(默认 1.5s)可能错过瞬时峰值;若问题偶发,建议配合 <code>perf record -e cpu-clock --call-graph dwarf -t <tid></tid></code> 录制后再分析。</p></iostream></unistd.h></sys>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











