嵌入式系统开发小白学习笔记(21)

上期回顾

嵌入式系统开发小白学习笔记(20)

嵌入式系统开发

线程补充内容

一、线程等待的目的

(1)保证线程的退出顺序:保证一个线程退出并且回收资源后,允许下一个进程退出。
(2)回收线程退出时的资源情况:保证当前线程退出后,创建新线不会复用刚才退出线程的地址空间。
(3)获得新线程退出时的结果是否正确退出返回值。

二、线程的状态

1、可结合态(默认状态):这种状态下的线程是可能被其他进程回收资源或被杀死的。
2、可分离态:这种状态下的线程不能被其他进程回收资源或被杀死,它存储的资源在它终止时由系统自动回收。
3、线程状态的转换:
线程分离函数:
pthread_detach()
int pthread_detach(pthread_t thread);
(1)功能:如果次线程不希望别人调用pthread_join函数来回收,而是希望自己在运行结束时,自动回收资源调用pthread_detach
将pthread_detach()中的线程变为分离态
(2)返回值:成功返回0,错误返回一个错误数字
(3)参数:thread:你要分离的那个次线程的TID
4、线程切换的实质:函数的切换,所以线程切换的开销低。

三、线程的同步

1、互斥锁
(1)定义一个互斥锁(变量)
函数:pthread_mutex_t mutex;
(2)初始化锁:预设互斥锁的初始值
pthread_mutex_mutex = PTHREAD_MUTEX_INITIALIZER(不常用)或者
int respthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr)
(3)加锁、解锁
加锁:
pthread_mutex_lock(&mutex);(阻塞加锁)访问临界区加锁操作
pthread_mutex_trylock();(非阻塞加锁)当锁被占用时,返回EBUSY而不是挂起等待
解锁:
pthread_mutex_unlock(&mutex) 访问临界区解锁操作

(4)进程退出时销毁互斥锁
2、功能:
初始化定义的互斥锁(就是设置互斥锁所需要的值)
3、返回值
总是返回0;所以这个函数不需要进程错误处理
4、参数
mutex:互斥锁,需要我们自己定义

四、线程信号量

线程信号量使用步骤:
1、定义信号量集和
sem_t sem [3]
线程信号量集合其实就是一个数组,数组每一个元素就是一个信号量
sem [0]:第一个信号量
sem [1]:第二个信号量
sem [2]:第三个信号量
2、初始化集合中每个信号量
(1)函数
#include <semaphore.h>
int sem_init(sem_t sem,int pthread,unsigned int value)
(2)功能:
初始化线程信号量集合中某个信号量,给它设置一个初值
(3)返回值
成功返回0,失败返回-1,error被设置
信号量的错误号不是返回的,而是直接设置到error
value:初始化值(1或0)
pshared:0:给线程用
3、p、v操作
P:int sem wait(sem t
sem);int sem trywait(sem tsem);int sem timedwait(sem tsem,const struct timespec *abs timeout);
在这里插入图片描述

4、进程结束时,删除线程信号量集合

五、条件变量(和互斥锁配合使用)

一条线程做自加,一条线程输出(当自变量到5输出之后自家变量清零)
条件变量的主要作用(线程协同):主线程对count+1,次线程发现当count==5时输出count的值,并将count清零
多线程配合工作时,当线程检测到某条件不满足时就休眠,直到别的线程将条件准备好,然后通过变量将其叫醒
使用步骤:
1、定义一个条件变量
pthread_cond_t
2、初始化
pthread_cond_init(pthread cond t restrict cond,const pthread condatter trestrict attr);
功能:初始化条件变量,与互斥锁类似
pthread _cond_t cond = PTHREAD COND INITALIZER
返回值:成功返回0,不成功返回非零错误号
参数:
(1)cond:条件变量
(2)attr:
3、使用条件变量
4、删除条件变量,也需要把互斥锁删除

注意点

注意:
(1)进程的所有信息存放在tach_struct中,进程信息包括进程号(pid)、地址空间和调用优先级。
(2)线程进程区别:
1、进程是资源分配的最小单位,线程是资源调度的最小单位。
2、每个进程有自己独立的地址空间,多个线程共享进程的地址空间。线程之间的切换比进程之间的切换开销要小。
3、线程的调度必须通过频繁的加锁来保持同步,影响线程的并发性。
4、进程比线程更健康,多进程之间相互独立。一个进程的异常对其他进程无影响。而一个线程的崩溃,可能影响其他线程或崩溃。
5、线程之间的通信方便(小数据量的),同一进程下,线程共享全局变量和静态变量,而进程之间的通信要以通信方式进行(IPC)。不过如何处理好同步和互斥,是编写多线程程序的难点。
6、多线程的代码结构比多进程代码结构简单易读。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值