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(); }
验证步骤
- 编译修改后的程序并运行,记录控制台输出的PID
- 使用以下工具查看线程:
htop:按F2进入设置,开启「显示线程」选项,找到对应PID的进程即可看到子线程ps -T -p <你的PID>:直接列出该进程下的所有线程top -H -p <你的PID>:实时查看该进程下的线程状态
内容的提问来源于stack exchange,提问作者Aleks_K
相关产品推荐
相关产品推荐

