Linux.14_多线程
进程VS线程

进程线程关系如下:
线程共享进程数据,也拥有自己的一部分数据:
线程ID、一组寄存器、栈、
一、线程简介
概念
- 线程是一个进程内部的控制序列,通俗的说:在一个程序里的一个执行路线就叫做线程(thread)。
- 一个进程至少有一个执行线程
- 线程在进程内部运行,本质是在进程地址空间内运行。
- 在Linux系统CPU眼中,看到的PCB都要比传统进程更加轻量化。
- 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
1.线程优缺点
优点:
- 线程启动速度快、量级轻(创建、切换)
- 线程系统开销小、占用资源小
缺点:
- 性能损失:线程的数量大于可用处理器时,会产生较大的性能损失,性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
- 健壮性降低:线程之间缺乏保护,eg:一个线程的变量容易影响另一个线程。
- 缺乏访问控制
- 编程难度提高
2.线程异常
- 单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
- 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出
3.线程用途
- 合理的使用多线程,能提高CPU密集型程序的执行效率和IO密集型程序的用户体验。
生活中一边洗澡一边下载游戏,就是多线程运行的一种表现。
二、线程控制
- 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的
- 头文件
- 链接操作需要使用:“-lothread” 选项
进程ID和线程ID
- 在Linux中,目前的线程实现是Native POSIX Thread Libaray,简称NPTL。在这种实现下,线程又被称为轻量 级进程(Light Weighted Process),每一个用户态的线程,在内核中都对应一个调度实体,也拥有自己的进程描述符(task_struct结构体)。
- 没有线程之前,一个进程对应内核里的一个进程描述符,对应一个进程ID。但是引入线程概念之后,情况 发生了变化,一个用户进程下管辖N个用户态线程,每个线程作为一个独立的调度实体在内核态都有自己的 进程描述符,进程和内核的描述符一下子就变成了1:N关系,POSIX标准又要求进程内的所有线程调用getpid函数时返回相同的进程ID,Linux内核引入了线程组的概念解决上述问题。
- 多线程的进程,又被称为线程组,线程组内的每一个线程在内核之中都存在一个进程描述符(task_struct) 与之对应。进程描述符结构体中的pid,表面上看对应的是进程ID,其实不然,它对应的是线程ID;进程描述符中的tgid,含义是Thread Group ID,该值对应的是用户层面的进程ID