目录
1. 线程的概念
1.1 基本概念
线程是进程中的一条执行流,是CPU调度的基本单位,一个进程中可以有多个线程
Linux下的线程执行流是通过pcb实现的,且一个进程中可能有多个pcb,并且这些pcb共享同一个进程中的大部分资源,因此,也被称为轻量级进程
Linux下,线程是CPU调度的基本单位,进程是系统进行资源分配的基本单位
1.2 线程之间的独有与共享
共享:虚拟地址空间(代码段和数据段)、文件描述符表、信号处理方式、工作路径
独有:线程栈、寄存器、信号屏蔽字、优先级、errno、线程标识符-ID
1.3 多进程与多线程多任务处理优缺点分析
共同优点:
在CPU资源足够的情况下都可以实现并行的任务处理,提高效率
IO密集型程序(程序中进行大量的IO操作,对CPU资源要求不高)中,同时发起IO操作减少IO阻塞时间
CPU密集型程序(程序中进行大量的数据运算,对CPU资源要求高)中,执行流的数量并不是越多越好,多了反而会增加调度成本
多线程进行多任务
优点:
(1)共享虚拟地址空间,因此线程间通信更加灵活(还可以通过全局变量、函数传参来实现通信)
(2)线程的创建和销毁成本更低
(3)同一个进程中的线程调度切换成本更低
缺点:健壮性低,有些调用和异常是针对整个进程产生的
例如:exit接口,进程退出会使进程中的所有线程都退出
大多数情况下,使用多线程,在稳定性要求高的场景中使用多进程
2. 线程控制(线程创建、终止、等待、分离)
我们操作线程的接口都是库函数,需要引入头文件<pthread.h>
链接这些线程函数库时要使用编译器命令的"-lpthread"选项
2.1 创建线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void* ), void *arg);
在用户态创建一个用户线程
thread:用于获取线程ID
attr:设置线程属性,设置为NULL,表示默认属性
start_routine:线程的入口函数
arg:通过线程入口函数给线程传递的参数
返回值:成功返回0,失败返回错误码
2.2 线程终止
(1)线程入口函数中执行return(线程入口函数运行完毕,线程退出)
(2)调用pthread_exit终止自己
(3)调用pthread_cancel终止同一进程中的另一个线程
void pthread_exit(void *value_ptr);
可以在任意位置,哪个线程调用哪个线程退出
int pthread_cancel(pthread_t thread);
thread:一个指定的线程ID
传入谁的ID谁退出
返回值:成功返回0,失败返回错误码
注意:主线程退出并不会导致进程退出(进程资源被释放),只有所有线程退出了进程才会退出
2.3 线程等待
线程默认情况下退出后,资源不会被回收,需要被其他线程等待,获取退出线程的返回值释放资源。
线程也不是必须被等待,在线程属性中,有一个分离属性,默