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