线程ID与线程ID

[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 函数,其实任意线程都可以对同一线程组内的线程执行分离操作
 

猜你喜欢

转载自blog.csdn.net/qq_38813056/article/details/85258143