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

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

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. PAT-链表-A1032 Sharing

    题意:给出两条链表的首地址以及若干个节点的的地址.数据.下一个节点的地址,求两条链表的首个共用节点的地址.如果两条链表没有共用节点,则输出-1. 思路:使用静态链表,首先遍历一遍第一个链表并进行标记. ...

  2. Python偶斐波那契数

    斐波那契数列中的每一项都是前两项的和.由1和2开始生成的斐波那契数列前10项为 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … 考虑该斐波那契数列中不超过四百万的项,求其中为 ...

  3. Vue - 过渡 列表过渡

    列表的进入/离开过渡 获取不大于数组长度的随机数,作为插入新值的位置 <div id="app" class="demo"> <button ...

  4. Centos7 下mysql 密码重置

    Centos7 下mysql 密码重置 先停止mysql服务 mysqld_safe --skip-grant-tables & mysql mysql> use mysql;mysql ...

  5. AcWing 841. 字符串哈希

    //快速判断两次字符串是不是相等 #include<bits/stdc++.h> using namespace std ; typedef unsigned long long ULL; ...

  6. Django流程-以登录功能为例

    Django流程-以登录功能为例 一.注意点 1.新创建的app一定要先去settings.py注册 简写:'app01' 完整:'app01.apps.App01Config' 2.启动Django ...

  7. AlertDialog 、SimpleDialog、 showModalBottomSheet、showToast 自定义 Dialog

    // AlertDialog .SimpleDialog.showModalBottomSheet.showToast // 使用showToast安装插件 https://pub.dev/packa ...

  8. ALSA lib基本概念

    1.channel 通道,即我们熟知的声道数.左/右声道,5.1channel等等 2.sample A sample is a single value that describes the amp ...

  9. 【C语言】用指针描述数组,实现选择法排序

    #include <stdio.h> int main() { ], t; int i, j, max; printf("请输入10个数:\n"); ; i <= ...

  10. 前端之js基础篇

    JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECM ...