[1]NPTL标准
1.目前的线程实现是 Native POSIX Thread Library,简称NPTL 。
2.线程又被称为轻量级进程。
3.每一个用户态的线程,在内核之中都对应一个调度实体也拥有自己的进程描述符(task_struct结构体)
4.进程内的所有线程调用 getpid 函数时返回相同的进程ID。
[2]线程组
struct task_struct {... // 线程组中线程的进程描述符
pid_t pid; // 线程ID
pid_t tgid; // 进程ID
struct task_struct *group_leader; // 主线程的进程描述符
struct list_head thread_group; // 线程的进程描述符链表
1.多线程的进程,被称为线程组。
2.线程组内的每一个线程在内核之中都存在一个进程描述符task_struct与之对应。
3.获取线程ID和进程ID
1.gettid() // 获取线程ID
2.getpid() // 获取进程ID
3.ps -eLf // 查看系统的所有进程和线程
LWP:线程ID, NLWP:线程组内线程的个数。
4.通过/proc/PID/task查看
5.glibc没有实现gettid(), 若需进程ID,可采用:
int TID = syscall(SYS_gettid) // 系统调用
6.线程组ID = 主线程ID = 进程ID
[3]强调
1.线程和进程不一样,进程有父进程的概念,但在线程组里面,所有的线程都是对等的关系
2.并不是只有主线程才能创建线程,被创建出来的线程同样可以创建线程。
3.不存在类似于fork函数那样的父子关系,大家都归属于同一个线程组,进程ID都相等,group_leade 都指向主线程,而且各有各的线程 ID 。
4.并非只有主线程才能调用 pthread_join 连接其他线程,同一线程组内的任意线程都可以对某线程执行pthread_join函数
5. 并非只有主线程才能调用 pthread_detach 函数,其实任意线程都可以对同一线程组内的线程执行分离操作