5.消息队列

消息队列

​ 消息队列是一种常用的线程间通讯方式,用来传输数据。使用消息队列传输数据时有两种方法:拷贝:把数据、把变量的值复制进消息队列里;引用:把数据、把变量的地址复制进消息队列里。rtt使用拷贝值的方法。

​ 消息队列的创建有两种方法:动态分配内存rt_mq_create、静态分配内存rt_mq_init

rt_mq_create的函数原型:

rt_mq_t rt_mq_create(const char* name, rt_size_t msg_size,rt_size_t max_msgs, rt_uint8_t flag);

​ 其中flag可取两个值:RT_IPC_FLAG_FIFO:先进先出,等待线程按照先进先出方式排队;RT_IPC_FLAG_PRIO:优先级等待,队列将按照优先级进行排队,优先级高的等待线程将会插队排在优先级低的等待线程前。

​ 同样消息队列的删除/脱离也有两种方法:rt_mq_delete(),rt_mq_detach()。

删除消息队列rt_mq_delete(),它会释放内存,如果删除消息队列时有线程在等待该队列,则内核会先唤醒这些线程(线程返回值是 - RT_ERROR),然后再释放消息队列使用的内存,最后删除消息队列对象

rt_err_t rt_mq_delete(rt_mq_t mq);

​ 发送消息有三种函数:rt_mq_send() 发送消息,rt_mq_send_wait() 等待方式发送消息,rt_mq_urgent() 发送紧急消息。线程或者中断服务程序都可以往消息队列写入消息。发送消息时,从空闲消息链表取一个空闲消息块,把消息复制到该消息块,然后把消息块挂到消息队列尾部。

  • 使用 rt_mq_send()发送消息时,队列中有空闲消息块时,才能成功发送消息,否则返回错误码(-RT_EFULL)。
  • 使用 rt_mq_send_wait()发送消息时,如果队列中没有可用的空闲消息块,会根据timeout 参数等待,超时后才返回错误
  • 使用 rt_mq_urgent()发送消息时,也要先得到空闲消息块,它会把消息块放在消息队列的头部,以便这个消息能被第 1 时间读取。

发送消息的函数原型如下:

rt_err_t rt_mq_send (rt_mq_t mq, void* buffer, rt_size_t size);

发送消息时,如果消息队列已满,并且有多个发送线程同时等待发送,这时当接收线程接收一个消息时,就会有一个空闲的位置,如果该消息队列是RT_IPC_FLAG_FIFO,那么就由等待最久的发送线程发送消息,如果该消息队列是RT_IPC_FLAG_PRIO,那么谁优先级高谁先发。

等待方式发送消息的函数原型如下:

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);

​ 当队列有消息时,使用收消息函数,可以从队列接收消息。如果没有消息,根据指定的 timeout 参数等待,直到超时结束。收消息的函数为rt_err_t rt_mq_recv ,原型如下:

rt_err_t rt_mq_recv (rt_mq_t mq, void* buffer,rt_size_t size, rt_int32_t timeout);

​ 如果由多个发送线程通过同一个消息队列发出数据,想要在接收线程中分辨数据来源,可以将写入消息队列的数据换成结构体,在结构体中写入数据来源

typedef struct {ID_t eDataID;          //数据来源int32_t lDataValue;    //数据
}Data_t;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-pytorch实现CBOW 0.5.000

python-pytorch实现CBOW 0.5.000 数据加载、切词准备训练数据准备模型和参数训练保存模型加载模型简单预测获取词向量降维显示图使用词向量计算相似度参考 数据加载、切词 按照链接https://blog.csdn.net/m0_60688978/article/details/137538274操作后,可以获得的数…

由近期 RAGFlow 的火爆看 RAG 的现状与未来

4 月 1 日,InfiniFlow (英飞流)的端到端 RAG 解决方案 RAGFlow 正式开源,首日即获得了 github 千星,目前已接近 3000 star。在这之前,InfiniFlow 还开源了专门用于 RAG 场景的 AI 原生数据库 Infinity&…

用 ElementPlus 的日历组件 Calendar 自定义渲染

文章目录 需求分析1. 英文改为中文2. 修改样式3. 自定义头部4. 增删改功能接入需求 使用 ElementPlus中的 Calendar 组件完成自定义渲染 分析 1. 英文改为中文 转为中文的方式:用 ElementPlus的日历组件如何改为中文 2. 修改样式 附源码<template><el-calendar&…

[工程经验] 模块设计规范

模块设计规范 文章目录 模块设计规范1.需求2.概念与逻辑图3.主要的数据结构图4.算法5.接口定义 1.需求 根据需求文档&#xff0c;摘录模块的对应部分&#xff0c;细化到可指导开发的程度&#xff0c;并根据实现的需要进行拓展&#xff0c;落地为一份设计文档。 2.概念与逻辑图…

linux查看硬盘空间使用情况

df &#xff08;1&#xff09;查看磁盘空间的占用情况 -h是给大小带上单位 df -h 总空间不一定等于已用未用&#xff0c;系统可能留出来一点空间另做他用 &#xff08;2&#xff09;查看INode的使用情况 df -idu du命令比df命令复杂一点&#xff0c;是查看文件和目录占用的…

【排序算法】七、快速排序补充:三指针+随机数法

「前言」文章内容是对快速排序算法的补充&#xff0c;之前的算法流程细节多难处理&#xff0c;这里补充三指针随机数法&#xff08;递归&#xff09;&#xff0c;这个容易理解&#xff0c;在时间复杂度上也更优秀 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(…

Docker-compose部署Alertmanager+Dingtalk+Prometheus+Grafana实现钉钉报警

部署监控 version: 3.7services: #dingtalkdingtalk:image: timonwong/prometheus-webhook-dingtalk:latestcontainer_name: dingtalkrestart: alwayscommand:- --config.file/etc/prometheus-webhook-dingtalk/config.ymlvolumes:- /data/monitor/dingtalk/config.yml:/etc/p…

部署GlusterFS群集

目录 一、部署GlusterFS群集 1. 服务器节点分配 2. 服务器环境&#xff08;所有node节点上操作&#xff09; 2.1 关闭防火墙 2.2 磁盘分区&#xff0c;并挂载 2.3 修改主机名&#xff0c;配置/etc/hosts文件 3. 安装、启动GlusterFS&#xff08;所有node节点上操作&…

51单片机入门_江协科技_25~26_OB记录的笔记_蜂鸣器教程

25. 蜂鸣器 25.1. 蜂鸣器介绍 •蜂鸣器是一种将电信号转换为声音信号的器件&#xff0c;常用来产生设备的按键音、报警音等提示信号 •蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器&#xff08;开发板上用的无源蜂鸣器&#xff09; •有源蜂鸣器&#xff1a;内部自带振荡源&a…

二:什么是RocketMQ

RocketMQ是阿里开源的消息中间件产品&#xff0c;纯Java开发&#xff0c;具有高吞吐量、高可用性、适合大规模分布式系统应用的特点,性能强劲(零拷贝技术)&#xff0c;支持海量堆积,在阿里内部进行大规模使用&#xff0c;适合在互联网与高并发系统中应用。 官方文档&#xff1a…

【Linux】虚拟化技术docker搭建SuitoCRM系统及汉化

CRM系统 CRM&#xff08;Customer Relationship Management&#xff0c;客户关系管理&#xff09;系统是一种用于管理和优化企业与客户关系的软件工具。在商业竞争激烈的现代社会中&#xff0c;CRM系统已成为许多企业提高销售、增强客户满意度和实现持续增长的重要工具。本文将…

Hive-生产常用操作-表操作和数据处理技巧-202404

hive语句操作 我这个只涉及到hive的对表的操作&#xff0c;包括建表&#xff0c;建分区表&#xff0c;加载数据&#xff0c;导出数据&#xff0c;查询数据&#xff0c;删除数据&#xff0c;插入数据&#xff0c;以及对hive分区表的操作&#xff0c;包括查看分区&#xff0c;添加…

【宝德PI300T G2智能小站开发教程(二)】命令行linux如何挂载移动硬盘

目录 一.前言 二.步骤 1.查找移动硬盘: 2.建立挂载点 3.挂载 4.进入硬盘 5.解除挂载 一.前言 Linux中的挂载是将存储设备(如硬盘、分区、USB驱动器等)与文件系统关联起来,以便能够访问和使用其存储空间。 二.步骤 1.查找移动硬盘:

数据检索的优化之道:B树与B+树的深度解析与应用探索

1、引言 在信息时代&#xff0c;数据检索的速度和效率对于任何依赖数据处理的系统来说都至关重要。无论是在线搜索引擎、数据库管理系统还是文件存储系统&#xff0c;快速准确地检索所需数据都是核心需求。传统的线性数据结构在处理大规模数据集时往往力不从心&#xff0c;因此…

计算器(C语言)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 介绍关键代码运行代码&#xff08;3种&#xff09; 介绍 标准计数器&#xff1a;执行加减乘除等等科学计算器&#xff1a;执行分数、统计学、指数函数、对数、三角…

封装Element-Plus表单组件

业务组件 <template><m-form ref="form":options="options" label-width="100px"@on-preview="handlePreview"@on-remove="handleRemove"@before-remove="beforeRemove"@on-exceed="handleExceed&…

如何学习JVM的知识

文章目录 1. 明确学习JVM知识的目的2. 高屋建瓴地审视知识点 1. 明确学习JVM知识的目的 为什么需要学习jvm的知识&#xff1f; jvm的知识重点是内存分配和垃圾回收&#xff0c;这些都是能更深入理解java代码运行原理的关键&#xff0c;也是求职面试中绕不过去的一个坎。 并且它…

BoostCompass(数据准备预处理模块)

阅读导航 一、网页数据下载二、编写数据去标签与数据清洗的模块 Parser✅boost 开发库的安装1. 基本思路2. 详细讲解&#xff08;1&#xff09;程序递归遍历目录&#xff0c;收集所有HTML文件的路径&#xff08;2&#xff09;对每个HTML文件进行解析&#xff0c;提取出文档标题…

【资源分享】书籍:现代统计学:使用Python的计算方法

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

【微服务】------微服务架构技术栈

目前微服务早已火遍大江南北&#xff0c;对于开发来说&#xff0c;我们时刻关注着技术的迭代更新&#xff0c;而项目采用什么技术栈选型落地是开发、产品都需要关注的事情&#xff0c;该篇博客主要分享一些目前普遍公司都在用的技术栈&#xff0c;快来分享一下你当前所在用的技…