一.线程的退出
方式一:
1.调用pthread_exit函数
void pthread_exit(void *retval)
功能:
结束调用的线程
参数:
@retval //退出状态值 //传的是,退出状态值 对应的地址
注意:
1.pthread_exit 本身表示结束线程
如果用在main函数中 表示结束主线程
主线程结束 并不表示进程
此时,
主线程执行流结束,进程会在其余线程都结束后,结束
线程推出后要进行资源回收
2.线程的资源回收
int pthread_join(pthread_t thread, void **retval);
功能:
等待线程结束
参数:
@thread --- 线程tid
@retval --- 用来保存,退出状态值,所在空间的地址
返回值:
成功 0
失败 错误码
注:
线程退出时,可以带出退出状态值,
但是传的是,退出状态值对应空间的地址
方式二:
1.通过回调函数(线程执行函数)的返回值
return + 线程执行函数返回值,效果与pthread_exit()一致
方式三:
发送取消请求
pthread_cancel
int pthread_cancel (pthread_t thread)
thread 是要发送线程的tid号
方式四:
任何一个线程调用了exit,或者主线程(main)return 都会造成进程结束
二.有关线程回收
线程资源回收
1.pthread_join //需要自己回收 ---线程的属性 (可结合性) --- 一般是子线程 在较短时间内运行完
2.pthread_detach //可分离属性 ---子线程运行很久才结束 --- 设置分离属性
pthread_detach函数相关:
pthread_detach();
int pthread_detach(pthread_t thread);
功能:
分离线程
参数:
thread 要分离的线程的tid
返回值:
成功 0
失败 错误码
三.进程与线程之间的优缺点对比
1.线程 vs 进程
线程 CPU执行的最小单位
进程 资源分配和任务调度基本单位
2. 各自特点 (优缺点)
//1.创建 和 调度
线程
创建速度快
调度速度快
//并发程度 更高
//2. 安全性
线程 【
好处:
共享了进程的数据空间
共享数据方面 方便
缺点:
安全性不好
带来资源竞争 】
进程 【
进程空间相互独立
好处,
安全性好
缺点:
进程间共享数据不方便 //进程间通信 (管道,信号,共享内存)】
四.线程间的资源竞争
共享资源: 临界资源
临界区: 访问共享资源(临界资源)那段代码
解决办法:使用互斥锁
使用过程:定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁
定义互斥锁:
pthread_mutex_t mutex;
互斥锁类型 互斥锁变量 内核对象
初始化锁
pthread_mutex_init(); //初始化一把锁
加锁 //加锁 加在 要访问临界资源的地方
pthread_mutex_lock(); //上锁
解锁
pthread_mutex_unlock(); //解锁 临界资源访问之后就解开
销毁
pthread_mutex_destroy();//销毁一把锁
函数原型:
int pthread_mutex_init(
pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr
);
参数:
@mutex //就是要初始化的 互斥锁变量
@attr //属性
//NULL 默认属性 --- 普通锁
//读写锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
参数:
@mutex //要操作的那把锁
int pthread_mutex_destroy(pthread_mutex_t *mutex); //用完之后锁要销毁