实例代码——点击获取git源码链接
Linux中的线程本质
——线程接口由Native POSIX Thread Library 提供,即:NPTL库函数(标准接口)
——线程被称为轻量级进程(Light Weighted Process)
——每一个线程在内核中都对应一个调度实体,拥有独立的结构体(task_struct)
-
内核设计:一个进程对应内核中的一个结构体,对应一个进程标识
-
引入线程:线程是内核的调度实体,在内核中必然对应一个结构体
—用户模式:一个进程中存在多个线程
—内核模式:每个线程是一个独立的调度实体
另一种视角。。。
—拥有我线程的进程,又被称为线程组(谁是线程组长?)
—在内核数据结构 task_struct中存在pid 和 tgid:
- pid_t pid->线程标识符(Thread ID)
- pid_t tgid->线程组标识符(Thread Group ID)
—进程创建后默认拥有一个线程:即:主线程(默认执行流)
—主线程的LWP标识符与进程标识符相同,即:主线程为线程组长(pid == tgid)
—其它子线程创建后隶属于当前进程:
- 子线程的LWP标识符各不相同,且与进程标识符不同
- 子线程调用getpid() 的结果相同(why?)
结论:运行在同一个进程下的不同线程的pid是一样的,但是调度标识是不同的,说明线程在内核层面是一个轻量级线程!
对于线程来说,pthread_t类型的标识符与pid_t类型标识有什么不同?
线程pid_t是全局范围内对调度实体的唯一标识
线程pthread_t 是应用程序中对线程的局部描述
通过 ps -eLf可查看 线程 与 进程,线程 与 线程 间的关系
结论:杀死一个线程标识,会杀死所有线程!(因为kill目标是进程)
多线程之间是否有“父子关系”?
答:无! 进程中只有主线程和子线程,线程之间没有“父子关系”
主线程如果先于子线程结束会发生什么?
— Linux中主线程如果执行结束,则进程结束
— 进程结束则进程资源被释放,子线程被迫结束
使用kill命令是否能够“杀死”指定线程?
— kill命令默认发送信号SIGTERM,而信号的目标是进程
— 因此,kill任意子线程的pid_t将导致整个进程结束
pthread_t究竟是什么数据类型?
— pthread_t是POSIX Thread 中的接口,具体定义与系统相关
— 通常情况下,pthread_t的具体定义是一个整型值
Linux多线程API函数
— 线程标识相等判断:
-
int pthread_equal(pthread_t t1, pthread_t t2);
-
如果t1与t2相等,返回非0值,否则返回0值
-
注意:
-
Linux系统编程时,可直接用t1 == t2 的方式判断是否相等
-
编写可移植的多线程代码,使用pthread_equal()判断是否相等
-