一、线程退出
1.线程结束方式:
1.pthread_exit
2.在线程执行函数中return (此时与1式相等)
3.pthread_cancel:
4.任何一个线程调用了exit 或者 主线程main函数return 都会使进程结束
2.pthread_cancel:int pthread_cancel()pthread_t thread);
参数:thread: 表示所要取消线程的tid号
成功返回0 失败返回错误码
3.线程资源回收:
1.pthread_join 需要自己回收 --线程的属性可结合性 一般是子线程在较短时间内运行完
2.pthread_detach 可分离属性 --子线程运行很久才结束 - 设置分离属性一般为系统回收
4.pthread_detach:int pthread_detach(pthread_t thread) ;
参数:thread :要分离线程的tid
成功返回0 失败返回错误码
一般在线程创建好后立马分离,以防线程运行过快而在未分离前结束
二、线程与进程对比
- 线程 : CPU执行的最小单位
进程 : 资源分配和任务调度基本单位
2、各自特点(优缺点)
1.创建 和 调度
线程:创建速度快 调度速度快 //并发程度更高
2.安全性
线程:优点:共享了进程的数据空间 共享数据方面 方便
缺点: 安全性不好
带来资源竞争 (专门的技术解决资源竞争 ---互斥 同步)
进程(进程空间相互独立):
优点:安全性好
缺点:进程间共享数据不方便 //进程间通信(管道,信号,共享内存)
3.编程
线程(多线程)复杂程度高于进程
4.线程间的资源竞争:
共享资源:临界资源
临界区:访问共享资源(临界资源)那段代码
机制: 互斥锁:互斥 排他性 ---要么不访问 要访问就是一次完整的操作(原子操作)
锁 :软件层面上的锁
5.锁的操作机制:定义互斥锁----初始化锁----加锁-----解锁-----销毁锁
6.定义互斥锁: pthread_mutex_t mutex:
互斥锁类型 斥锁变量 内核对象
初始化锁:pthread_mutex_init();
参数:第一个为要初始化的互斥锁变量,第二个为属性,一般默认为NULL普通锁
加锁: pthread_mutex_lock(); (阻塞操作)
解锁: pthread_mutex_unlock();
销毁:pthread_mutex_destroy();
尝试锁:pthread_mutex_trylock();(尝试锁,避免陷入死锁)(非阻塞操作)
参数均为要操作的那把锁
7.死锁:产生的四大条件,缺一不可:
1、互斥条件
2、不可剥夺条件
3、请求与保持条件
4、循环等待条件
8.死锁处理:
1、预防死锁
2、避免死锁
3、死锁检测和解除
9.线程间的顺序问题:
同步操作 强调的是线程的顺序问题
信号量 交通信号灯 实现了一种可以让线程间有序访问临界资源的方式
信号量 --- 可以顺序操作的一把锁