一 线程间的同步与互斥:信号量、互斥量、实践集

线程互斥是指对于临界区资源访问的排它性,如多个线程对共享内存资源的访问,生产消费型对产品的操作。临界区操作操作方法有:

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学习之线程间同步与通信的更多相关文章

  1. linux c 线程间同步(通信)的几种方法--互斥锁,条件变量,信号量,读写锁

    Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量.信号量和读写锁. 下面是思维导图:  一.互斥锁(mutex)  锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1 . ...

  2. linux线程间同步方式总结梳理

    线程间一般无需特别的手段进行通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同时使用.只是要注意的是线程间须要做好同步! 使用多线程的理由: 1. 一个是和进程相比,它是一种非常&q ...

  3. C#线程间同步无法关闭

    用C#做了个线程间同步的小程序,但每次关闭窗口后进程仍然在,是什么原因? 解决方法: 要加一句 线程.IsBackground = true; 否则退出的只是窗体 上面的方法没看懂... MSDN上说 ...

  4. Linux系统编程(29)——线程间同步(续篇)

    线程间的同步还有这样一种情况:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,而线程B在执行过程中使这个条件成立了,就唤醒线程A继续执行.在pthread库中通过条件变 ...

  5. linux线程间同步方式汇总

    抽空做了下linux所有线程间同步方式的汇总(原生的),包含以下几个: 1, mutex 2, condition variable 3, reader-writer lock 4, spin loc ...

  6. conditon_variable(条件变量)用于线程间同步

    conditon_variable(条件变量)用于线程间同步 condition_variable有5个函数,函数名及对应的功能如下: wait阻塞自己,等待唤醒 wait_for阻塞自己,等待唤醒, ...

  7. c++11 线程间同步---利用std::condition_variable实现

    1.前言 很多时候,我们在写程序的时候,多多少少会遇到下面种需求 一个产品的大致部分流程,由工厂生产,然后放入仓库,最后由销售员提单卖出去这样. 在实际中,仓库的容量的有限的,也就是说,工厂不能一直生 ...

  8. Java学习:线程间通信

    线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同重点:有效的利用资源 分析:需要那些类 1 资源类:包子类 设置包子的属性 包子的状态:有true 没有false 2 ...

  9. Java学习之线程间通信(双线程)

    线程间通讯:多个线程在处理同一资源,但是任务不同 练习一:双线程出现线程安全问题,需要使用同步,思考同步代码添加位置需求:银行账户存钱,显示谁在账户存钱了,存了多少钱分析:操作同一银行账户两个不同的操 ...

随机推荐

  1. HTML学习(3)基础

    *开始标签常被称为起始标签(opening tag),结束标签常称为闭合标签(closing tag). *虽然有时候忘记写结束标签有的浏览器也能正常显示内容,但有时候会出现不可预料的结果或错误,所以 ...

  2. 210. 课程表 II

    Q: 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量 ...

  3. Gevent和猴子补丁

    定义 在2018年看Flutent python时了解到猴子补丁,知道咋回事,但是现在通过代码更深刻认识猴子补丁. 猴子补丁:在运行时修改类或模块,而不改动源码. 例子1 没有用猴子补丁 import ...

  4. python正则分组

    python的正则表达式本身每一个字符串都是独立的 看下面的例子就理解分组的含义了~ ab*表示的是查找a和(0个或多个b),就是*是单独针对b的,所以返回a (ab)*则表示ab是一个组是一个整体, ...

  5. CefApp和CefClient的作用

    CefApp 在cefsimple中,提到了一个cefapp的类型,这个类型是一个接口类,主要目的是提供获取三种handler的接口 /// // Implement this interface t ...

  6. Lindström–Gessel–Viennot lemma定理 行列式板子

    https://blog.csdn.net/qq_37025443/article/details/86537261 博客 下面是wiki上的讲解,建议耐心地看一遍...虽然看了可能还是不懂 http ...

  7. Spring 属性依赖注入

    1.1    属性依赖注入 依赖注入方式:手动装配 和 自动装配 手动装配:一般进行配置信息都采用手动 基于xml装配:构造方法.setter方法 基于注解装配: 自动装配:struts和spring ...

  8. centos7的netca命令和netmgr命令、dbca命令等基础知识点

    netca命令: netmgr命令: dbca命令: database assistant  configuration 中的SGA 和PGA SGA:System Global Area是Oracl ...

  9. windows10重置后,鼠标键盘失灵

    用大白菜u盘选择工具修复一下驱动

  10. 本次我们使用idea构建springmvc项目

    该案例的github地址:https://github.com/zhouyanger/demo/tree/master/springmvcdemo1 1.首先我们可以创建maven项目,file-&g ...