【Linux】知识点:线程ID与LWP

【Linux】知识点:线程ID与LWP 一、问题提出
在平时实验过程中,很容易发现线程的ID与命令行查看的LWP并不是同一个值,在此对该现象进行探讨 。
实验复现:
#include #include #include void* threadRun(void *args){while(1){printf("New thread id: 0x%x\n",pthread_self());sleep(1);}}int main(){pthread_t tid;pthread_create(&tid,NULL,threadRun,(void*)pthread_self());while (1){printf("Main Thread id: 0x%x\n",pthread_self());sleep(1);}}
【【Linux】知识点:线程ID与LWP】

【Linux】知识点:线程ID与LWP

文章插图
[root@VM-12-7-centos Blog_pthread]# ./testMain Thread id: 0xd9830740New thread id: 0xd9028700Main Thread id: 0xd9830740New thread id: 0xd9028700Main Thread id: 0xd9830740New thread id: 0xd9028700
二、问题解释
实际上,所看到的线程ID是在库中的线程ID,不是内核中的LWP,的线程ID是一个内存地址 。
在进程的地址空间中,存在一个区域为mmap区域,其中通过页表将物理内存的动态库,映射到进程的地址空间中来 。在动态库中,会存在一些数据结构来描述线程的用户级控制块,这些控制块会将线程运行的私有的临时数据进行保存,为线程私有结构,在该用户级私有结构中也保存了内核中对应的LWP 。示意图如下:
补充: