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

Ubuntu 20.04下如何查看C++ std::thread创建的子线程?

问题:Ubuntu 20.04下无法通过htop/ps/top查看C++多线程程序的子线程

问题原因

你的子线程函数func仅执行一行调试输出就立即终止,生命周期极短。程序启动后,子线程会快速完成任务并退出,等你打开htop等工具查看时,子线程已经不存在,只剩主线程在运行Qt的事件循环(a.exec())。

解决方案

1. 让子线程持续运行

修改func函数,添加循环或延时,保证子线程在你查看时处于活跃状态:

#include <chrono> // 需要新增头文件

void func() {      
    while (true) {
        qDebug() << "_func_";
        // 每秒输出一次,避免刷屏
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

注意:后续需添加线程终止逻辑(比如全局标志位控制循环退出),避免程序无法正常结束。

2. 主线程暂停等待,预留查看时间

在主线程调用join()前添加输入等待,同时给子线程增加短暂延时,确保查看时子线程仍在运行:

#include <chrono>

void func() {      
    qDebug() << "_func_";
    std::this_thread::sleep_for(std::chrono::seconds(5)); // 子线程保持运行5秒
}  

int main(int argc, char *argv[]) {      
    QCoreApplication a(argc, argv);       
    std::thread t(&func);    
    std::thread t1(&func);     
    std::thread t2(&func);       

    std::cout << "进程PID: " << getpid() << std::endl;
    std::cout << "按回车键继续..." << std::endl;
    std::cin.get(); // 暂停主线程,此时子线程仍在运行

    t.join();     
    t1.join();     
    t2.join();       

    std::cout << "_threads_" << std::endl;       
    return a.exec(); 
}

验证步骤

  1. 编译修改后的程序并运行,记录控制台输出的PID
  2. 使用以下工具查看线程:
    • htop:按F2进入设置,开启「显示线程」选项,找到对应PID的进程即可看到子线程
    • ps -T -p <你的PID>:直接列出该进程下的所有线程
    • top -H -p <你的PID>:实时查看该进程下的线程状态

内容的提问来源于stack exchange,提问作者Aleks_K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:01:06