實際是被PID的名字給弄混了,線程進程都會有自己的ID,這個ID就叫做PID,PID是不特指進程ID,線程ID也可以叫做PID。
pthread庫里的每一個線程都對應一個內核線程,都是有單獨的pid。


The four threads will have the same PID but only when viewed from above. What you (as a user) call a PID is not what the kernel (looking from below) calls a PID.
In the kernel, each thread has it's own ID, called a PID (although it would possibly make more sense to call this a TID, or thread ID) and they also have a TGID (thread group ID) which is the PID of the thread that started the whole PRocess.
Simplistically, when a new process is created, it appears as a thread where both the PID and TGID are the same (new) number.
When a thread starts another thread, that started thread gets its own PID (so the scheduler can schedule it independently) but it inherits the TGID from the original thread.
That way, the kernel can happily schedule threads independent of what process they belong to, while processes (thread group IDs) are reported to you.
關于線程繼承關系圖如下:
USER VIEW <-- PID 43 --> <----------------- PID 42 -----------------> +---------+ | process | _| pid=42 |_ _/ | tgid=42 | /_ (new thread) _ _ (fork) _/ +---------+ / / +---------++---------+ | process || process | | pid=44 || pid=43 | | tgid=42 || tgid=43 | +---------++---------+ <-- PID 43 --> <--------- PID 42 --------> <--- PID 44 ---> KERNEL VIEW在這里你可以清晰的看到,創建一個新的進程會給一個新的PID和TGID,并且2個值相同,當創建一個新的線程的時候,會給你一個新的PID,并且TGID和之前開始的進程一致。
Linux通過進程查看線程的方法 1).htop按t(顯示進程線程嵌套關系)和H(顯示線程) ,然后F4過濾進程名。2).ps -eLf | grep java(快照,帶線程命令,e是顯示全部進程,L是顯示線程,f全格式輸出) 3).pstree -p <pid>(顯示進程樹,不加pid顯示所有) 4).top -Hp <pid> (實時) 5).ps -T -p <pid>(快照) 推薦程度按數字從小到大。
打印線程的PID的方法如下:getpid()方法可以打印進程的PIDgettid()方法可以打印線程的PIDvoid * thread_start(void *arg) { printf("Process ID: %d, thread ID %d/n", getpid(), gettid()); } 由于gettid()在glibc中沒有包含Note: There is no glibc wrapper for this system call; see NOTES. 所以用如下syscall函數在用戶空間替代gettid()的功能syscall(__NR_gettid)) 或者 syscall(SYS_gettid)在文件 /usr/include/bits/syscall.h里, 有一行:#define SYS_gettid __NR_gettid 可見二者是一樣的。__NR_gettid是系統調用號#include <pthread.h> #include <stdio.h> #include <sys/types.h> #include <sys/syscall.h> #include <unistd.h> void * thread_start(void *arg) { printf("[1] Process ID: %d, thread ID %d/n", getpid(), syscall(__NR_gettid)); printf("[2] Process ID: %d, thread ID %d/n", getpid(), syscall(SYS_gettid)); }
新聞熱點
疑難解答