深入浅出线程原理_学习笔记

实例代码——点击获取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()判断是否相等

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值