一、线程结束
1.1、pthread_exit 本身表示结束线程
如果用在main函数中 表示结束主线程
主线程结束并不表示进程
此时执行逻辑,主线程执行流结束,进程会在其余线程都结束后,结束
1.2、return 从线程中返回
线程执行函数执行结束,这个等价于调用了phread_exit()也就是说return 的方式一样
所以可以使用return 语句,可以从线程放回结束
3、ptrhead_cancel()
被取消(被别人结束),被另外一个线程结束,或者是说被别人结束(他杀)
int pthread_cancel(pthread_t thread);
被别人发送一个信号结束,这个是他杀,所以cancel相当于kill
功能:发送取消的请求
参数:thread 表示给谁发,要发送的线程的pid 号
返回值
成功返回0
失败返回error number
他只结束他的所请求的信号
注意段错误的原因是
我们在做的过程中,可能还没有做完,发射了一个结束信号,线程没有结束返回的信息,故出现段错误
1.4、exit()
在任何线程中使用eixt,其是结束进程,即进程结束则线程也结束,主线程(main函数)return
都会造成进程结束。
二、线程资源回收
1、pthread_join //需要自己回收 --- 线程的属性 (可结合性),阻塞,一般是子线程在较短时间内运行完
2、 //可分离属性 ------子线程运行很久结束 --- 设置分离属性,系统自动回收
2.1、pthread_detach()
分离一个线程
设置分离的状态,当一个分离的线程资源结束,他的资源自动被系统进行回收,不需要另一个线程等待回收,主线程也不需要关心子线程状态。注意一个线程只能分离一次。
功能:分离线程
参数
thread 要分离的线程
返回值
成功返回0
失败返回error number
一般在创建好之后立马设置分离状态,注意好时机。
一个线程只能分离一次
三、对比 线程 和 进程
3.1、线程 vs 进程
线程 cpu执行的最小单位
进程 资源分配和任务调度基本单位
3.2、各自特点(优缺点)
//1、创建 和 调度
线程
创建速度快
调度速度快
线程的并发程度 更高
time 命令 + 运行的程序名 ,会告诉程序运行的时间
//2.安全性
1、线程
好处:共享了进程的数据空间,在共享数据比较方便
缺点:安全性不好,带来资源竞争 //专门的技术 解决资源竞争 ----互斥 同步
2、进程
进程空间相互独立
好处,安全性好
缺点:
进程之间共享数据不方便,传输数据不方便//进程间通信(管道,信号,共享内存)
eg、子进程写了一个段错误,对父进程的没有影响
段错误相当于发信号,这个信号是对进程所发。
针对实际需要,主要看优点。
四、针对线程的缺点的解决方法
4.1、线程间的资源竞争
共享资源:临界资源
临界区: 访问共享资源(临界资源)那段代码
因为访问公共资源如果互相访问,会产生干扰,可能你还没有做完,另一方来打断处理。
4.2、解决办法
互斥锁
互斥 排他性 -----要么不访问,要访问就是一次性完整操作 (原子操作)//相当于我们把我们所进行的操作作为一个原语;也就是说一次只能访问一个程序
锁 //
//软件层面上的锁
4.3、锁的执行过程
- 定义互斥锁:pthread_mutex_t mutex;互斥锁类型 互斥锁变量
- /互斥锁 互斥量 pthread_mutex_init();//初始化一把锁初始化锁 尽量放在创建锁之前
- pthread_mutex_lock();//上锁;加锁 加在要访问临界资源的地方
- 解锁pthread_mutex_unlock();//解锁临界资源访问完之后
- 销毁pthread_mutex_destroy();//销毁一把锁销毁的目的是因为我们在用的时候,会浪费使用的资源
4.4、pthread mutex init()
pthread mutex init(*restrict_mutex_pthread mutext ,const pthread mutexattr trestrict attr);//初始化一把锁
功能
初始化互斥锁
参数解读
- 第一个就是要初始化的互斥锁变量
- 属性
- //NULL 默认属性 ---普通锁
- //读写锁