文章目录
- 一、线程概念
- 1. 线程的出现
- 2. linux 对线程的设计
- 3. 线程
- 二、进程和线程
- 1. 进程和线程的关系
- 2. 进程的调度
- 3. 轻量级进程
- 三、pthread库
- 1. pthread 库的作用
- 2. 手动链接 pthread库
- 四、创建线程
- 1. pthread_create()
- 2. 函数的使用
- 3. 线程和函数
- 五、线程等待
- 1. 新线程的运行和结束
- 2. 等待新线程
- 六、线程退出
- 1. 线程运行完毕,自动退出
- ① 出异常,进程直接退出
- ② pthread_join() 不考虑线程异常情况
- 2. 代码退出线程
- ① exit () 终止进程
- ② pthread_exit ()
- ③ pthread_cancel ()
一、线程概念
1. 线程的出现
-
线程?
先来简单了解一下:
这里只是意会一下,不是说进程就只有一个PCB
+ 进程地址空间而已(进程 = 内核数据结构 + 可执行程序),这样画是比较简单示意。 -
创建进程:
进程创建的时空成本是较高的,有各种数据结构的创建,数据的加载。
如地址空间就是父子进程各有一个:
文件系统也是需要各有一个的:
关于这一点,进程地址空间 和文件系统 这两个文章中都可见端倪,上面两个图都是从这两个文中拿来的(文章都很短,如果有兴趣可以翻翻)。 -
创建线程:
地址空间和地址空间上的虚拟地址,本质是一种“资源”,是资源就可以共享。
将代码分成几份,并创建对应个数的PCB
,分别执行不同的代码区,就可以将串行执行变成了并发执行了。
我们的代码在进程中,全都是串行调用的,创建进程,是为了多执行流并发执行,所以创建进程和创建线程都可以,但是显然创建一个线程的成本要低得多啊!
2. linux 对线程的设计
操作系统(OS
)要对线程进行管理——先描述,再组织。
下面我们来看,描述线程的结构体:
-
描述线程的结构体中要有各种信息,如对应的进程,线程标识符,线程优先级,上下文状态等,大概就如下:
-
我们觉得这样还是复杂,而且我们发现,线程中的很多信息是和进程的重合的,所以
Linux
的设计者认为,进程和线程都是执行流,有很高的相似性,没必要单独设计数据结构和算法,可以直接复用代码,使用进程来模拟线程。如下:
复用的话,维护成本较低;如果单独设计,就要单独设计数据结构、匹配的算法,代码会比较复杂。 -
Linux
的线程模块是复用的进程的,而也有单独设计线程模块的系统,这个系统叫Windows
。
3. 线程
所以,我们可以了解到线程:
- 线程是进程内部的一个执行分支,线程在进程的地址空间内运行。
- 线程是
CPU
调度的基本单位。CPU
调度是让PCB
排队的,现在线程就是复用的进程的PCB
, 所以CPU
是可以调度一个个线程的。
二、进程和线程
1. 进程和线程的关系
进程是承担分配系统资源的基本实体,而线程是进程内的一个执行分支。所以线程算是包含在进程中的。
2. 进程的调度
CPU
不关心你是进程还是线程,按正常的调度算法执行就行了(当然有些属于线程、进程的细节会区别处理)。
3. 轻量级进程
从上面,我们可以看到,CPU
调度的执行流要么就是进程,要不就是线程。
- 对于
Linux
来说,所有的调度执行流都叫做轻量级进程,不区分进程和线程了。在Linux
中,线程是用进程模拟的,在CPU
看来,看到的 PCB 都比传统的进程更轻量化,所以叫“轻量级进程”。 - 对于操作系统,进程内部只有一个执行流,那这个执行流就叫进程: