Linux软件编程:进程与线程(线程的传参、属性、通信(互斥锁、信号量))
一、线程传参
- 可以通过pthread_create第四个参数实现对线程内部的传参
二、线程属性
(一)线程属性
1.加入属性:①线程结束需要pthread_join手动回收
②可以回收到线程结束的状态
③可以完成线程间的同步
2.分离属性:①线程结束后系统自动回收线程空间
②线程结束后,不需要pthread_join手动回收
(二)函数接口
1.pthread_attr_init
2.pthread_attr_setdetachstate
3.pthread_attr_destroy
三、线程间通信
(一)概念:多个线程间传递信息
(二)方式
1.采用全局变量
1.1进程是操作系统资源分配的最小单位
1.2每个进程空间独立,包含文本段+数据段(全局变量)+系统数据段
1.3一个进程中的多个线程独享栈空间,文本段、数据段、堆区进程多线程共享
2.注意:多线程同时操作共享空间会引发资源竞争,需要加上互斥锁解决资源竞争问题
四、互斥锁
- 解决资源竞争的一种方式,可以看成是一种资源
- 只能加锁一次,解锁期间不能再次加锁,也不能强制占有一个加锁的锁资源,必须等待锁资源释放,也就是解锁后才能继续操作该锁
- 加锁和解锁中间的代码成为临界代码,也称为临界区
- 只能防止多个线程对资源的竞争,不能决定代码的先后执行顺序
- 原子操作:CPU执行原子操作时无法切换调度任务
(一)使用方式
1.定义互斥锁(全局变量)
2.对锁初始化
3.操作全局资源前先加锁
4.如果加锁成功则完成对全局资源的操作
5.如果加锁失败则表示有人占用资源,必须等待其余人释放锁资源才能加锁成功
6.直到加锁成功使用该全局资源
(二)函数接口
1.pthread_mutex_init
2.pthread_mutex_lock
3.pthread_mutex_unlock
4.pthread_mutex_destroy
五、死锁
(一)概念:多线程由于加锁解锁错误导致程序无法向下继续运行的状态称死锁状态,简称为死锁
(二)死锁产生的四个必要条件:①互斥性②不可剥夺性③请求保持性④循环等待条件
(三)如何避免死锁
1.加锁顺序保持一致
2.使用pthread_mutex_trylock替换pthread_mutex_lock
六、信号量
(一)概念
- 信号量是一种资源
- 信号量只能完成四种操作:初始化、销毁、申请、释放
- 如果信号量资源为0,申请资源会阻塞等待,直到占用资源的任务释放资源,资源数不为0时才能申请到资源并继续向下执行
- 释放资源不会阻塞
(二)函数接口
1.sem_init
2.sem_destroy
3.sem_wait
- 申请信号量会让信号量资源数-1
- 如果信号量资源数为0,则会阻塞等待,直到有任务释放资源,能拿到资源并继续向下执行
4.sem_post