为什么要知道一个进程启动了多少个线程?奇怪的是,这个非常重要的性能调优概念明确了这里所说的线程指的是内核级线程,而不是用户态线程。所谓用户态线程,是指不依赖于操作系统,在用户态实现的执行流调度。这里的线程数是指进程运行时的线程数,这个值会随着线程的创建和销毁而动态变化。本文重点介绍Linux平台。背景知识和原理/proc/{pid}/proc/{pid}记录了每个进程运行时的所有关键信息。谁生成这些信息?答案是Linux内核。Linux内核在执行你写的程序时,会把所有的关键信息写入/proc/{pid},所以你可以查看这个目录下的信息来查看进程的运行时行为,对有好奇心的人很有用关于内核如何运行程序的同学很重要。你可以把这个目录下的信息理解为Linux内核在执行你写的程序时打印的日志。通过这个Log可以知道进程启动了多少个线程。进程号:pidLinux内核在执行程序时需要为每个进程分配一个id,类似于ID号的作用,用来标识一个进程。因此,要想得到一个进程启动了多少个线程,首先要知道进程id。实验1:最简单的情况让我们看看最简单的helloworld程序有多少个线程:#include#includeintmain(){std::cout<<"helloworld";睡眠(1000);//保持进程不退出return0;}接下来编译运行:$g++s.cpp-ohelloworld$./helloworld&[1]125626我们可以发现helloworld进程的进程号是125626,有之后知道进程号,我们可以检查进程启动了多少个线程。运行以下命令:$cat/proc/125626/status|grepThreadsT??hreads:1可以看到,和我们预想的一样,helloworld进程只有一个线程开启。实验二:稍微复杂一点的情况在这个实验中,我们动态创建线程:#include#includevoid*func(void*arg){sleep(10000);}intmain(){pthread_tid;对于(inti=0;i<10;i++){pthread_create(&id,NULL,func,NULL);睡觉(10);}return0;}在这个程序中,我们动态创建了10个Thread,每个线程休眠10秒,每个线程休眠10000秒。编译运行:$g++s.cpp-ohelloworld$./helloworld&[1]125667$cat/proc/125667/status|grep线程线程:2$cat/proc/125667/status|grep线程线程:2$cat/proc/125667/status|grep线程线程:3$cat/proc/125667/status|grep线程线程:4$cat/proc/125667/status|grep线程线程:5$cat/proc/125667/status|grep线程线程:6$cat/proc/125667/status|grepThreadsT??hreads:10可以看到用cat查看线程数时,进程创建了两个线程。如果快速查看两次,你会发现线程数据是2,但是过了一段时间(10s以上),你会发现线程数是3,最后线程数是10,也就是符合我们的预期。结束语通过命令“cat/proc/{pid}/status|grepThreads”,可以动态查看正在运行的线程数。还有一点……如果喜欢本文,请关注我的微信公众号码农荒岛求生,获取更多计算机内功知识。计算机内功决定程序员的职业高度