rtt学习之线程间同步与通信
一 线程间的同步与互斥:信号量、互斥量、实践集
线程互斥是指对于临界区资源访问的排它性,如多个线程对共享内存资源的访问,生产消费型对产品的操作。临界区操作操作方法有:
rt_hw_interrupt_disable() / rt_enter_critical()进入临界区,
rt_hw_interrupt_enable() / rt_exit_critical()退出临界区
信号量的创建:rt_sem_t rt_sem_create(const char *name,rt_uint32_t value,rt_uint8_t flag);//信号量值为0时则资源不可用进入等待(按队列或优先级排序)
rt_err_t rt_sem_delete(rt_sem_t sem);
rt_err_t rt_sem_init(rt_sem_t sem,const char *name,rt_uint32_t value,rt_uint8_t flag)//动态创建
rt_err_t rt_sem_detach(rt_sem_t sem);
信号量的申请:rt_err_t rt_sem_take (rt_sem_t sem, rt_int32_t time);
rt_err_t rt_sem_trytake(rt_sem_t sem);//不等待式申请。
信号量的释放:rt_err_t rt_sem_release(rt_sem_t sem);//加1
用途:
1 线程间同步/中断与线程间的同步:类似完成标志,初始值为0,线程或中断触发后为1即先释放后才能申请到,使原来等该标志的实践由false变为true
2 锁(二值信号量的互斥):初值为1,申请到的线程可以使用共享资源,并将信号量变为0;别的线程则因为资源已经被占用则必须等待直到资源被释放(信号量变为大于0)
3资源计数:适合于线程间工作处理速度不匹配的场合,可进行递增和递减。
互斥量:
特殊的信号量,与信号量的区别:信号量可以被多个线程释放,容易造成优先级反转问题;互斥量只能由现在持有的线程释放,初始化时是开锁状态,有线程申请到之后就是闭锁了,可以解决优先级反转(多个线程等待时临时让正在使用互斥量的线程的优先级提高到和等待列表中优先级最高的那个线程优先级一样,避免被抢占,使用完释放后自动恢复原理的优先级) ,需要切记的是互斥量不能在中断服务例程中使用
操作函数也还是动态创建、解绑、初始化、删除、申请、释放。
事件集: 可取代信号量,可对等待最高32个事件进行与或操作
rt_event_t rt_event_create(const char* name, rt_uint8_t flag);//fllag: 等待方式RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO
rt_err_t rt_event_delete(rt_event_t event);
rt_err_t rt_event_init(rt_event_t event, const char* name, rt_uint8_t flag);
rt_err_t rt_event_detach(rt_event_t event);
rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set);
rt_err_t rt_event_recv(rt_event_t event, rt_uint32_t set, rt_uint8_t option, rt_int32_t timeout, rt_uint32_t* recved);//option :RT_EVENT_FLAG_OR /RT_EVENT_FLAG_AND/RT_EVENT_FLAG_CLEAR
线程间的通讯:邮箱、消息队列、信号
邮箱:
开销低,效率较高,可以发送4字节的整型数据或者指针,操作函数也还是动态创建、解绑、初始化、删除、发送、等待式发送(邮箱慢时等待)、接收(是否等待,若等待则设置超时),邮箱的大小等于邮箱的buff大小/4。
消息队列
是另一种常用的线程间异步通讯方式,是邮箱的扩展。可以应用在多种场合:线程间的消息交换、使用串口接收不定长数据等。发送消息队列是直接进行拷贝,所以可用局部变量不用担心已经释放的问题。通常使用线程之间采用消息队列+邮箱或者信号量,其中邮箱(反馈4字节的内容)或者信号量(单一通知是否收到)是接收者的反馈信息。
rt_err_t rt_mq_send_wait(rt_mq_t mq, const void *buffer, rt_size_t size, rt_int32_t timeout);//发送时若满指定的超时时间内等待。
rt_err_t rt_mq_urgent(rt_mq_t mq, void* buffer, rt_size_t size);//挂到队列首部而非末尾
信号:
是一种异步处理,类似于软中断
void rt_signal_mask(int signo):屏蔽信号则该信号将不会递达给安装此信号的线程,也不会引发软中断处理
rt_signal_unmask() 可以用来解除信号阻塞。
rtt学习之线程间同步与通信的更多相关文章
- linux c 线程间同步(通信)的几种方法--互斥锁,条件变量,信号量,读写锁
Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量.信号量和读写锁. 下面是思维导图: 一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1 . ...
- linux线程间同步方式总结梳理
线程间一般无需特别的手段进行通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同时使用.只是要注意的是线程间须要做好同步! 使用多线程的理由: 1. 一个是和进程相比,它是一种非常&q ...
- C#线程间同步无法关闭
用C#做了个线程间同步的小程序,但每次关闭窗口后进程仍然在,是什么原因? 解决方法: 要加一句 线程.IsBackground = true; 否则退出的只是窗体 上面的方法没看懂... MSDN上说 ...
- Linux系统编程(29)——线程间同步(续篇)
线程间的同步还有这样一种情况:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,而线程B在执行过程中使这个条件成立了,就唤醒线程A继续执行.在pthread库中通过条件变 ...
- linux线程间同步方式汇总
抽空做了下linux所有线程间同步方式的汇总(原生的),包含以下几个: 1, mutex 2, condition variable 3, reader-writer lock 4, spin loc ...
- conditon_variable(条件变量)用于线程间同步
conditon_variable(条件变量)用于线程间同步 condition_variable有5个函数,函数名及对应的功能如下: wait阻塞自己,等待唤醒 wait_for阻塞自己,等待唤醒, ...
- c++11 线程间同步---利用std::condition_variable实现
1.前言 很多时候,我们在写程序的时候,多多少少会遇到下面种需求 一个产品的大致部分流程,由工厂生产,然后放入仓库,最后由销售员提单卖出去这样. 在实际中,仓库的容量的有限的,也就是说,工厂不能一直生 ...
- Java学习:线程间通信
线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同重点:有效的利用资源 分析:需要那些类 1 资源类:包子类 设置包子的属性 包子的状态:有true 没有false 2 ...
- Java学习之线程间通信(双线程)
线程间通讯:多个线程在处理同一资源,但是任务不同 练习一:双线程出现线程安全问题,需要使用同步,思考同步代码添加位置需求:银行账户存钱,显示谁在账户存钱了,存了多少钱分析:操作同一银行账户两个不同的操 ...
随机推荐
- idea中运行ssm 或springboot项目时,project Structure的配置
ctrl+alt+shift+s进入 project Structure 首先是project选项 Modules 标明source testsource 以及 resource 和 testreso ...
- 【网易官方】极客战记(codecombat)攻略-地牢-辐射光环
关卡连接: https://codecombat.163.com/play/level/radiant-aura 骷髅,恐惧还是回避? 简介: 敬请期待! 默认代码 # 捡起发光石,让骷髅怪远离你一会 ...
- 吴裕雄 python 机器学习——数据预处理二元化Binarizer模型
from sklearn.preprocessing import Binarizer #数据预处理二元化Binarizer模型 def test_Binarizer(): X=[[1,2,3,4,5 ...
- jquery 复制
Jq将字符串复制粘贴到剪贴板 第一种: 自己测试时 只适合于input 和textarea 但是针对于其他标签的复制就不能用了.代码如下: <!DOCTYPE html> < ...
- svn还原与本地版本回退
今天遇到了一个情况,由于没及时更新,对整个项目进行了Ctrl+shift+O,提交代码时冲突:然后就先还原项目,导致之前没有冲突的代码也回退了.然后就在eclipse中获取本地的版本记录,并回退 具体 ...
- 【音乐欣赏】《Wrong》 - Far Out / Emilia Ali
曲名:Wrong 作者:Far Out / Emilia Ali [00:16.03]Ride body on mine [00:18.07]Griping your waist as I was o ...
- 【游戏体验】Buttonhunt(鼠标寻找按钮)
虽然画风千奇百变 但这款益智游戏的趣味性相当高 推荐试玩 个人测评 游戏性 9/10 音乐 4/10 剧情 6/10 总评 19/30
- Petr and a Combination Lock
Petr has just bought a new car. He's just arrived at the most known Petersburg's petrol station to r ...
- go基础_defer
defer defer是go语言中的关键字 特点:FILO 作用:保障一些申请的资源最终得以释放 func main() { defer fmt.Println("line-1") ...
- HyperLedger Fabric 资料网址大全
BLOCKCHAIN FOR DEVELOPERS 官方网址 i. 这个网址是ibm给的测试网址,注册进去就可以设置4个节点的区块链,而且有智能合约可以测试 区块链和HyperLedger开源技术讲堂 ...