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学习之线程间通信(双线程)
线程间通讯:多个线程在处理同一资源,但是任务不同 练习一:双线程出现线程安全问题,需要使用同步,思考同步代码添加位置需求:银行账户存钱,显示谁在账户存钱了,存了多少钱分析:操作同一银行账户两个不同的操 ...
随机推荐
- 阿里云CentOS7.2把默认语言修改成中文
转载TimeK 最后发布于2017-04-19 14:43:35 阅读数 7578 收藏 展开 我是一个刚接触centos不久的新人,在这个问题上面也是找了好久的答案,百度百科和问答上面的都大同小异 ...
- library 中的internal power为何为负值?
下图是library中一个寄存器Q pin 的internal_power table, 表中该pin 的internal power 大多都是负值.其实library 中的internal_powe ...
- flutter web 配置环境及运行(windows)
此下 操作 都是基于 windows 一, 将镜像添加到 用户环境变量中 由于在国内访问Flutter有时可能会受到限制,Flutter官方为中国开发者搭建了临时镜像,大家可以将如下环境变量加入到用 ...
- codeforces 962F.simple cycle(tarjan/点双连通分量)
题目连接:http://codeforces.com/contest/962/problem/F 题目大意是定义一个simple cycle为从一个节点开始绕环走一遍能经过simple cycle内任 ...
- HTML连载60-水平居中与设计一个团购界面
一.水平居中 1.margin:0 auto在绝对定位中就失效了 2.如何让绝对定位的元素水平居中? 只需要设置绝对定位元素的left:50%:然后再设置绝对定位元素的margin-left:-元素宽 ...
- Git的基本使用 -- 历史版本、版本回退
查看提交的日志(历史版本) git log 不能查看已删除的commit记录 git reflog 可以查看所有分支的所有操作记录,包括已删除的commit记录 版本回退 git reset --ha ...
- jsoup学习待续
1.Jsoup简介 Jsoup是一个java html解析器.它是一个用于解析HTML文档的java库.Jsoup提供api来从URL或HTML文件中提取和操作数据.它使用DOM,CSS和类似 Jqu ...
- Java-POJ1002-487-3279(含c++代码)
Java 的读入还不熟练,解决不了空行的问题,还是只能用c++ A掉,唉~ 之后要把这个坑补掉 解决了,开心(*^▽^*)以下是AC的Java代码 以下是C++代码 #include<cstdi ...
- MXnet的使用
关于MXnet的介绍: MXNet: A flexible and efficient library for deep learning. 这是MXNet的官网介绍,“MXNet是灵活且高效的深度学 ...
- ubuntu的dpkg命令安装和卸载软件
实际使用中,可以先到网上下载deb文件,然后用dpkg命令来安装. sudo dpkg -l | grep 360 #查看包含360的软件sudo dpkg -i browser360-cn-stab ...