情感测试简介

首页 » 常识 » 预防 » Rtthread学习总结之信号量三
TUhjnbcbe - 2021/5/21 0:15:00

#努力一点,现在想要的未来都会有。

一直在兜兜转转没有向前,Rt_thread学习也是拖拖拉拉。

在最近的项目中开始使用,简单的创建线程,其实就可以满足使用,但仅仅是使用创建线程的方式,靠系统时间片调度线程在我看来与裸机开发无疑,所以开始使用Rt的IPC机制来参与线程之前的通信。

首先了解下LPC机制是什么。

ipc进程通讯(IPC,Inter-ProcessCommunication)指至少两个进程或者线程间传输数据或信号的一些技术或方法。

进程间通讯技术包括消息传递、同步、共享内存和远程过程调用。

学习应用完之后,我感觉对深入了解Linux内核的IPC应该有所帮助,所以废话不多说开干。

线程之前需要同步运行,当然也可以异步运行,为了达到同步和异步运行,这个目的引入了信号量来实现。

1、线程间同步

什么是线程同步?

同步是按预定的先后顺序进行,线程同步指多个线程按特定机制来控制线程之前执行顺序,也就是线程间通过同步建立起顺序关系。

那为什么需要线程同步?

假如两个线程访问同一个内存,一个线程对内存读,一个线程对内存写,所以需要先对内存进行写,写完之后另一个线程才能读。这样可以保证内存中的数据不会错乱。

2、信号量

用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到线程同步或互斥的目的。

互斥信号量

作互斥时,信号量创建后,可用信号量个数是满的,线程在需要使用临界资源时,先获取信号量,使其变空,其它线程在使用临界资源因无法获取信号量而进入阻塞状态,保证临界资源的安全。

同步信号量

作同步时,信号量创建后,置空,线程1取信号量而阻塞,线程2在某种条件发生后,释放信号量,线程1进入就绪状态,如果线程1的优先级是最高的,就会立即切换线程,从而达到两个线程间同步,当然在中断服务函数中释放信号量,也能达到线程与中断间的同步。

创建动态信号量函数

rt_sem_trt_sem_create(constchar*name,rt_uint32_tvalue,rt_uint8_tflag);#name:信号量名称#value:信号量初始值#flag:信号量标志,RT_IPC_FLAG_FIFO

RT_IPC_FLAG_PRIO//当选用FIFO(先进先出)方式,等待线程队列将按照先进先出方式排队,先进入的线程将先获得等待额信号量。//当选用PRIO(优先级等待)方式,等待线程队列将按照优先级进行排队,优先级高的等待线程,将先获得等待信号量。

删除动态信号量函数

rt_err_trt_sem_delete(rt_sem_tsem);#sem:rt_sem_create创建的信号量对象

创建静态信号量函数

rt_err_trt_sem_init(rt_sem_tsem,constchar*name,rt_uint32_tvalue,rt_uint8_tflag);#sem:信号量对象句柄#name:信号量名称#value:信号量初始值#flag:信号量标志

删除静态信号量函数

rt_err_trt_sem_detach(rt_sem_tsem);#sem:信号量对象句柄

获取信号量函数

线程通过获取信号量来获得信号量资源实例,当信号量值大于0,线程将获得信号量,并相应的信号量值减1。当信号量值等于0,说明当前信号量资源不可用,申请该信号量的线程,将根据time参数的情况选择直接返回、挂起

、或等待一段时间、或永久等待,知道其他线程或中断释放该信号量。

rt_err_trt_sem_take(rt_sem_tsem,rt_int32_ttime);#sem:信号量对象的句柄#time:指定的等待时间,单位是操作系统时钟节拍(ostick)//返回值#RT_EOK:成功获得信号量#RT_ETIMEOUT:超时依然未获得信号量#RT_ERROR:其他错误

无等待获取信号量

不想在申请的信号量上挂起线程进行等待,可使用无等待方式获取信号量,等同于rt_sem_take(sem,0);

1rt_err_trt_sem_trytake(rt_sem_tsem);

释放信号量函数

用于释放信号量,唤醒挂在该信号量上的线程。

rt_err_trt_sem_release(rt_sem_tsem);

那么如何使用信号量呢?如何应用到项目工程中呢?

1先梳理逻辑

信号量的用于实现线程之前的同步或临界资源的互斥访问。

2确定是需要线程同步还是互斥

同步:信号量在创建后置空,线程1获取信号量阻塞,线程2在某种条件发生后,释放信号量,使得线程1进入到就绪状态。

互斥:信号量创建后信号量个数是满的,线程在需要使用临界资源时,先获取信号量,使其变空,其它线程需要临界资源就会因无法获取信号量而进入阻塞,从而保证临界资源(可能会导致优先级翻转)

线程thread1获取速度线程

线程thread2灯效1线程1

线程thread3灯效2线程2

创建--同步信号量

线程thread3线程一直跑。

线程thread2一直等待信号量。

线程thread1获取到速度之后就释放信号量。

当释放完成信号量之后,thread2就会获取到信号量,线程thread2就开始运行。

但目前还有一个问题,是当thread3线程与thread2线程需要运行一个,比如,当有速度的时候,thread2线程运行,当无速度的时候线程3运行。两个线程只需运行其中一个。所以考虑是挂起线程,还是利于其它方式,使线程只运行一个。

End-/3/:09

预览时标签不可点收录于话题#个上一篇下一篇
1
查看完整版本: Rtthread学习总结之信号量三