版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nice_wen/article/details/80801099
由于本人才疏学浅,本文难免存在遗漏之处,欢迎大家留言指正,本人将感激不尽。 强调内容
一、线程号的获取
首先,我们要知道一个进程可能包含多个线程,每个线程都有自己的id。获取线程id存在下面两种方法:
1、pthread_t pthread_self(void):
其中返回值类型为pthread_t,类型的定义如下所示:
typedef unsigned long int pthread_t
注意,pthread_self获取的线程id只是在该线程所属的进程内有用,进程内部可以通过pthread_self获取的id来区分线程,并且在不同进程内的线程可能存在相同的由pthread_self所获取的id,系统无法用此id来区分线程。
2、pid_t gettid(void):
返回类型为pid_t,实际上pid_t为int类型。
在Linux中进程id类型也为pid_t,所以我们可以看到,在linux 中线程其实是通过进程来实现的。
通过gettid()获取的id在整个系统内都是可见的,每个线程都具有独一无二的由gettid获取的id。
gettid用法举例
#include <sys/syscall.h>
printf("%d %d\n", getpid(), syscall(SYS_gettid)); //通过系统调用使用
二、命令行查看某个进程的所有线程
bash> ps -p 105357 -T
PID SPID TTY TIME CMD
105357 105357 pts/18 00:00:00 ta
105357 105358 pts/18 00:00:00 ta
此处获取进程105357的所有线程,可以看到该进程有两个线程,105357和105358,其中105357为主线程。
三、获取系统内的所有线程
bash> ps -Lef | grep 105357
UID PID PPID LWP C NLWP STIME TTY
wen 105357 98076 105357 0 2 13:47 pts/18 00:00:00 ./ta
wen 105357 98076 105358 0 2 13:47 pts/18 00:00:00 ./ta
wen 105412 104637 105412 0 1 13:51 pts/19 00:00:00 grep --color=auto 105357
可通过命令ps -Lef获取所有线程,其中列LWP(轻量级进程)即为线程。