如何查看线程资源占用?std::thread::id与htop的PID不匹配求解
解决std::thread::id与htop线程ID不匹配的问题
核心原因
std::thread::id是C++标准库定义的抽象线程标识,仅在程序内部保证唯一,和Linux内核分配的系统级线程ID(TID,也就是htop里PID列显示的线程ID)完全不是同一概念,所以自然无法匹配。要对应上htop的线程ID,必须在代码中获取系统层面的线程TID。
具体解决方案
在Ubuntu(Linux)下,有两种简单可靠的方式获取线程的系统TID:
1. 直接调用系统调用
无需额外依赖,直接通过syscall获取内核分配的线程ID:
#include <sys/syscall.h> #include <unistd.h> // 获取当前线程的系统TID pid_t get_thread_tid() { return syscall(SYS_gettid); }
2. 借助pthread库(兼容std::thread)
Linux下std::thread底层基于pthread实现,也可以通过pthread接口转换得到系统TID:
#include <sys/syscall.h> #include <pthread.h> #include <unistd.h> pid_t get_thread_tid() { return syscall(SYS_gettid); }
注:两种方式本质都是调用SYS_gettid系统调用,结果完全一致。
使用示例
在线程函数中打印系统TID,即可和htop显示的线程ID对应:
#include <iostream> #include <thread> #include <sys/syscall.h> #include <unistd.h> pid_t get_thread_tid() { return syscall(SYS_gettid); } void worker_thread() { std::cout << "抽象线程ID:" << std::this_thread::get_id() << std::endl; std::cout << "系统TID(对应htop):" << get_thread_tid() << std::endl; // 你的线程业务逻辑 } int main() { std::thread t1(worker_thread); std::thread t2(worker_thread); t1.join(); t2.join(); return 0; }
验证步骤
编译运行程序后,打开htop按H键(开启线程显示模式),找到你的进程PID,就能看到每个线程的TID,和代码中打印的数值完全匹配。
内容的提问来源于stack exchange,提问作者sisao sin
相关产品推荐
相关产品推荐

