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

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

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学习(12)列表

    HTML包括有序列表ol(ordered list).无序列表ul(unordered list).自定义列表dl(difinition list) 有序列表: <ol start=" ...

  2. Oracle创表操作记录

    Oracle表操作 --主键,复合主键 create table example (id number primary key, name varchar2(20)); create table ex ...

  3. linux 下查看Tomcat的状态,以及开启停止服务命令

    1.首先进入你的tomcat 的bin目录下 cd /你的安装目录/tomcat/bin 查看服务启动情况 ps -ef|grep java 此条命令具体含义 ps:将某个进程显示出来 -A 显示所有 ...

  4. 如何用navicat连接linux服务器上的mysql以及重启服务

    1,开启mysql权限:https://www.cnblogs.com/NaughtyCat/p/how-to-connect-to-mysql-on-linux-by-navicat.html my ...

  5. Navicat Premium破解

    1.正常下载安装 2.把PatchNavicat.exe文件放到Navicat安装目录下 3.以管理员身份启动PatchNavicat.exe 4.运行Navicat即可

  6. Linux查看mysql是否启动的命令

    使用命令 # service mysqld status 或者 # service mysql status 来查看mysql 的启动状态. 如果是 mysqld is stopped 那就说明mys ...

  7. 关于为什么使用React新特性Hook的一些实践与浅见

    前言 关于Hook的定义官方文档是这么说的: Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 简单来说,就是在 ...

  8. jenkins和hudson

    自动化构建:Jenkins起源于Hudson.Hudson在商业软件的路上继续前行,而Jenkins则作为开源软件,从hudson分支出来. 因此现在的jenkins和hudson非常类似,但是随着二 ...

  9. Block Chain Learning Notes

    区块链是什么 区块链技术是由比特币创造的,本文也将从比特币开始进行引导,一步一步告诉大家什么是区块链.如果你想立马知道区块链是什么,也可以直接转到文章末尾的区块链定义. 区块链,可能是当下最有前景又充 ...

  10. Apache Thrift Learning Notes

    简介 Apache Thrift软件框架(用于可扩展的跨语言服务开发)将软件堆栈与代码生成引擎结合在一起,以构建可在C ++,Java,Python,PHP,Ruby,Erlang,Perl,Hask ...