struct task_struct { ... pid_t pid;// 对应的是线程ID , 就是我们看到的lwp pid_t tgid;// 线程组ID , 该值对应的是用户层面的进程ID ... struct task_struct *group_leader; ... struct list_head thread_group; ...};
如何查看线程ID?
1.使用ps命令 , 带-L选项 , 可以查看到lwp
2.Linux提供了gettid系统调用来返回其线程ID , 可是glibc并没有将该系统调用封装起来 , 在开放接口来供程序员使用 。如果确实需要获得线程ID , 可以采用如下方法:
#include <sys/syscall.h>pid_t tid; tid = syscall(SYS_gettid);在前面的一张图片中(如下) , 我们可以发现的是 , 有一个线程的ID和进程ID是一样的 , 这个线程就是主线程 。在内核中被称为group leader , 内核在创建第一个线程时 , 会将线程组的ID的值设置成第一个线程的线程ID , group_leader指针则指向自身 , 既主线程的进程描述符 。所以线程组内存在一个线程ID等于进程ID , 而该线程即为线程组的主线程 。
文章插图
注意: 线程和进程不一样 , 进程有父进程的概念 , 但是在线程组中 , 所有的线程都是对等关系 。
线程ID和进程地址空间布局pthread_create产生的线程ID和gettid获得的id不是一回事 。后者属于进程调度范畴 , 用来标识轻量级进程 。前者的线程id是一个地址 , 指向的是一个虚拟内存单元 , 这个地址就是线程的ID 。属于线程库的范畴 , 线程库后序对线程操作使用的就是这个ID 。对于目前实现的NPTL而言 , pthread_t的类型是线程ID , 本质是进程地址空间的一个地址:
文章插图
这里的每一个线程ID都代表的是每一个线程控制块的起始地址 , pthread_create返回的就是线程控制块的起始地址 。这些线程控制块都是struct pthread类型的 , 所以所有的线程可以看成是一个大的数组 , 被描述组织起来 。
线程退出在线程中我们可以调用exit函数或者_exit函数来结束进程 , 在一个线程中我们可以通过以下三种方式在不终止整个进程的情况下停止它的控制流 。
- 从线程函数return 。这种方法对主线程不适用 , 从main函数return相当于调用exit 。
- 线程可以调用pthread_exit终止自己
- 一个线程可以调用pthread_ cancel终止同一进程中的另一个线程
经验总结扩展阅读
- 知天命是多少岁 古代年龄称谓
- 正常家庭一天用多少度电
- B站寂寞是什么意思
- 普通人直播带货能赚多少钱
- 2023双十一天猫消费券可以领几次 双十一天猫消费券怎么领取
- 2023淘宝双十一和双十二活动一样吗 双十一和双十二哪个优惠力度大
- 2023淘宝双十一活动力度大吗 淘宝双十一购物攻略有哪些
- 蒸双臭是什么食物
- 11月3日山东多地再现大风降温天气 半岛地区等地阵风可达7级以上
- 柿饼是热性还是凉性 多吃柿饼好不好