image.png
image.png
image.png
image.png
image.png

gettid()和pthread_self()

gettid返回的是tid,即内核线程ID,这个ID实际上是每个线程task_struct中的pid域,所以单线程进程的tid == pid。在多线程进程中,不同的线程拥有独一无二的pid值,所以每个线程的tid值不同。所以实际上tid = task_struct的pid = LWP号
pthread_self() 返回的是posix描述的线程ID。
在POSIX线程库下每一线程也有一个ID,类型pthread_t,就是通过pthrea_self()得到的。该ID由线程库维护,不同进程的pthread_t类型的线程ID可能相同。

为什么有两个线程ID(thread ID)

描述线程的id,为什么需要两个不同的ID呢?这是因为线程库实际上由两部分组成:内核的线程支持+用户态的库支持(glibc),Linux在早 期内核不支持线程的时候glibc就在库中(用户态)以纤程(就是用户态线程)的方式支持多线程了,POSIX thread只要求了用户编程的调用接口对内核接口没有要求。
linux上的线程实现就是在内核支持的基础上以POSIX thread的方式对外封装了接口,所以才会有两个ID的问题。