方式1
pthread_exit
Void pthread_exit (void *retval)
功能:
结束调用的线程
参数:
retval //退出状态值 //需要传的是,退出状态值的地址
注意:
1.pthread_exit 本身表示结束线程
如果用在main函数中 表示结束主线程
主线程结束 并不表示进程
方式2:
在次线程中return
此时的效果相当于调用了pthread_exit()
方式3:
调用pthread_cancel(pthread_t pthread)
功能:
通过发送取消的请求来结束次线程
参数;
pthread:要结束的线程的tid号
线程的资源回收
Int pthread_join(pthread_t thread,void **retval)
功能:
等待线程结束
参数:
返回值:
成功 0
失败 错误码
注:
线程退出时,可以带出退户状态值
但是传的是
1.pthread_join //需要自己回收 -----线程的属性(可结合性) --一般是子线程 在短时间内运行完
2.//可分离属性 ----子线程运行很久才结束 ---设置分离属性
函数:
Pthread_detach()
Int pthread_detach(pthread_t thread);
功能:
分离线程
参数:
thread 要分离的线程的tid
返回值:
成功 0
失败 错误码
对比 线程 和 进程
1.线程 vs 进程
线程 cpu 执行的最小单位
进程 资源分配和任务调度的最小单位
2.各自特点(优缺点)
//1.创建 和 调度
线程
创建速度快
调度速度快
//线程的并发程度 更高
Time:获取可执行程序的运行时间
线程
优点:因为共享了进程的数据空间,所以在共享数据方面,更方便
缺点:安全性不好
带来了资源竞争 //专门的技术 解决资源竞争 ----互斥 同步
进程
优点:进程空间相互独立,好处就是安全性更高
缺点:进程间共享数据不方便 //进程间通信 (管道,信号,共享内存)
线程间的资源竞争:
共享资源:临界资源
临界区:访问共享资源(临界资源)的代码
机制:
互斥锁
互斥 排他性
锁
定义互斥锁:
pthread_mutex_t mutex;
互斥锁类型 互斥锁变量 内核对象
加锁: //加锁 加在 要访问临界资源的地方
Pthread_mutex_lock() //加锁
解锁: //临界资源访问完就解锁
Pthread_mutex_unlock() //解锁
销毁:
Pthread_mutex_destory() //销毁一把锁
因为使用锁的时候会占用一部分硬件资源,如果不销毁的话,硬件资源不会被释放
Pthread_mutex_init()
功能:
初始化 互斥锁
int pthread_mutex_init(
总结:
//锁是一种线程间 同步机制
//互斥锁 保证线程对于共享资源的排他性访问
保证每个线程访问时的原子性操作(不可分割)
//操作
//初始化 一把锁
// 动态初始化pthread_mutex_init
// 静态初始化 用初始化的宏
// 加锁
// 解锁
// 销毁
处理错误:
全局变量的默认初始值为0
线程间的顺序问题;
//同步操作
强调的是线程的 顺序问题
信号量 //交通信号灯
//实现一种可以让线程之间有序访问的=临界资源的方式
信号量的本质:
一把锁
//一把可以顺序操作的锁