You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看线程资源占用?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:20:38