Windows下Cygwin环境g++编译的C++多线程程序线程不显示问题咨询
为什么Cygwin中
ps看不到C++多线程程序的线程? 你猜的完全没错!Cygwin下用g++编译的std::thread确实是基于Windows原生线程实现的,而ps/ps -W看不到线程的原因,主要和Cygwin的线程模型以及命令本身的作用有关:
Cygwin的线程实现逻辑:
Cygwin为了提供POSIX兼容环境,它的pthreads库是基于Windows原生线程(Win32 threads)封装的。而g使用的libstdc标准库中,std::thread底层就是依赖Cygwin的pthreads实现,所以你的程序里的th1和th2最终都会转化为Windows系统的原生线程,属于同一个Windows进程的一部分。ps/ps -W的显示限制:- 普通的
ps命令是Cygwin模拟POSIX环境的工具,它只显示Cygwin层面的进程——每个Cygwin进程对应一个Windows进程,线程作为进程内部的执行单元,不会被单独列出来。 ps -W是用来显示Windows系统的进程列表,但Windows的进程列表本身就不包含线程条目:线程是进程的子实体,不属于独立的进程范畴,所以这个命令也只会显示你的程序对应的单个进程。
- 普通的
如何验证线程的存在:
如果你想确认线程确实在运行,可以用这些方法:- 在Cygwin终端中,先用
ps找到你的程序的PID,然后执行pstree -p <你的PID>,这个命令会展开显示进程下的所有线程(Cygwin将线程视为轻量级进程,会在输出中体现)。 - 使用Windows自带的任务管理器:找到你的程序进程,右键选择「转到详细信息」,然后右键表头勾选「线程数」,就能看到该进程的线程数量;或者在Windows命令提示符中执行
tasklist /v /fi "PID eq <你的PID>",也能看到线程数信息。 - 用
gdb调试程序:启动gdb ./你的程序,运行后输入info threads,就能看到当前所有存在的线程及其状态。
- 在Cygwin终端中,先用
内容的提问来源于stack exchange,提问作者Ahmed A
相关产品推荐
相关产品推荐

