CyberRT-共享内存实现
CyberRT共享内存类图
共享内存消息发布

数据用共享内存发布时,首先会创建ShmTransmitter对象,包含两个主要成员segment和notifier,Segment用于创建共享内存(上面绿色部分),Notifer 最终构建ReadableInfo通知给其他进程。
使用哪个ConditionNotifier-> notify或MulticastNotifier->notify,是在创建时根据配置文件决定的。
ConditionNotifier 在构建时会创建Indicator对象保存到共享内存中。
调ConditionNotifier-> notify,实际时将ReadableInfo保存到Indicator对象。
ConditionNotifier 共享内存数据接收

在接收数据时,也会创建同样的共享内存。如果共享内存存在,则直接打开。
在接收端也有同样的共享内存操作ConditionNotifier 。
ShmDispatcher会持有多个通道segment,用std::unordered_map<channelid, segment>表示。
同时启动一个后台线程ThreadFunc 线程轮询处理消息回调。
void ShmDispatcher::ThreadFunc() {ReadableInfo readable_info;// 轮询处理while (!is_shutdown_.load()) {// 100ms, Listen会转换100000 ms,对比seq,如果不等处理消息。每次轮询会等待递减50ms。if (!notifier_->Listen(100, &readable_info)) {ADEBUG << "listen failed.";continue;}if (readable_info.host_id() != host_id_) {ADEBUG << "shm readable info from other host.";continue;}//从共享内存Indicator中读出的数据uint64_t channel_id = readable_info.channel_id();uint32_t block_index = readable_info.block_index();{ReadLockGuard<AtomicRWLock> lock(segments_lock_);if (segments_.count(channel_id) == 0) {continue;}// check block index// std::unordered_map<uint64_t, uint32_t> previous_indexes_; // 保存key: channelID, value: block_indexif (previous_indexes_.count(channel_id) == 0) {previous_indexes_[channel_id] = UINT32_MAX;}uint32_t& previous_index = previous_indexes_[channel_id];if (block_index != 0 && previous_index != UINT32_MAX) {if (block_index == previous_index) {ADEBUG << "Receive SAME index " << block_index << " of channel "<< channel_id;} else if (block_index < previous_index) {ADEBUG << "Receive PREVIOUS message. last: " << previous_index<< ", now: " << block_index;} else if (block_index - previous_index > 1) {ADEBUG << "Receive JUMP message. last: " << previous_index<< ", now: " << block_index;}}previous_index = block_index;ReadMessage(channel_id, block_index);}}
}
MulticastNotifier共享内存数据接收
MulticastNotifier时采用多播socket实现的,默认
std::string mcast_ip("239.255.0.100");
uint16_t mcast_port = 8888;
创建两个socket notify_fd_ 用于发生消息,listen_addr用于接收消息。

在发送端调用Notify时,时调的MulticastNotifier::Nofify(const ReadableInfo& info)
bool MulticastNotifier::Notify(const ReadableInfo& info) {if (is_shutdown_.load()) {return false;}std::string info_str;info.SerializeTo(&info_str);ssize_t nbytes =sendto(notify_fd_, info_str.c_str(), info_str.size(), 0,(struct sockaddr*)¬ify_addr_, sizeof(notify_addr_));return nbytes > 0;
}
接收端用同样的方式轮询
bool MulticastNotifier::Listen(int timeout_ms, ReadableInfo* info) {if (is_shutdown_.load()) {return false;}if (info == nullptr) {AERROR << "info nullptr.";return false;}struct pollfd fds;fds.fd = listen_fd_;fds.events = POLLIN;int ready_num = poll(&fds, 1, timeout_ms);if (ready_num > 0) {char buf[32] = {0}; // larger than ReadableInfo::kSizessize_t nbytes = recvfrom(listen_fd_, buf, 32, 0, nullptr, nullptr);if (nbytes == -1) {AERROR << "fail to recvfrom, " << strerror(errno);return false;}return info->DeserializeFrom(buf, nbytes);} else if (ready_num == 0) {ADEBUG << "timeout, no readableinfo.";} else {if (errno == EINTR) {AINFO << "poll was interrupted.";} else {AERROR << "fail to poll, " << strerror(errno);}}return false;
}
bool Block::TryLockForWrite() {int32_t rw_lock_free = kRWLockFree;//lock_num_ == rw_lock_free, kWriteExclusive赋值给lock_num_,返回true//lock_num_ != rw_lock_free, lock_num_赋值给rw_lock_free,返回falseif (!lock_num_.compare_exchange_weak(rw_lock_free, kWriteExclusive,std::memory_order_acq_rel,std::memory_order_relaxed)) {ADEBUG << "lock num: " << lock_num_.load();return false;}return true;
}
总结
1、CyberRT的共享内存读写都时需要加锁的。
2、每次写数据可以是不连续的block
3、每次当Block.lock_num_= 0:空闲,>0:有读操作, -1 : 写操作。
效率不是高。
相关文章:
CyberRT-共享内存实现
CyberRT共享内存类图 共享内存消息发布 数据用共享内存发布时,首先会创建ShmTransmitter对象,包含两个主要成员segment和notifier,Segment用于创建共享内存(上面绿色部分),Notifer 最终构建ReadableInfo通…...
linux通过串口传输文件
简介 在嵌入式调试过程中,我们经常会使用调试串口来查看Log或者执行指令,其实,调试串口还有另一种功能,就是传输文件,本文说明使用MobaXterm串口工具来传输文件。 环境要求 嵌入式系统需要安装lsz和lrz,…...
uniapp 打包后各静态资源加载失败的问题(背景图,字体等)
原因: 1.部署地址不在域名根目录下 解决办法(推荐办法2): 办法1.如果部署在域名的文件夹下(例如h5), 则运行的基础路径修改为/h5/ 且注意路由模式 办法2.不修改运行的基础路径(还是./), 将代码中涉及背景图(background-image)和字体资源的路径前统一加,如图: tips: 标签内s…...
关于git hooks
Git hooks 是一种在 Git 仓库中触发自定义脚本的机制。这些脚本可以在特定的 Git 操作(如提交、推送、合并等)发生时执行。通过使用 Git hooks,你可以在版本控制的不同阶段自动运行脚本,以执行一些定制化的操作。 在 Git 中&…...
mongodb数据库的常用操作语句
说在前面的话 本文所有的操作示例,都以集合“HistoryTaskBase”为例。 一、查询 1、时间区间 查询“通知时间”介于2019-09-01到2019-10-01之间的数据。 db.getCollection(HistoryTaskBase).find({notifyTime:{$gte:ISODate(2019-09-01T00:00:00.000Z),$lte:ISOD…...
ubuntu安装完qt后发现找不到图标
layout: post # 使用的布局(不需要改) title: Qt启动问题 # 标题 subtitle: ubuntu安装完Qt #副标题 date: 2023-11-18 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catalog: true # 是否归档 tags: …...
bazel远程构建(Remote Execution) -- Buildfarm部署中的问题
问题1:server报logOverdueOperation和WARNING: removed dispatched operation shard/operations/, worker报WARNING: missing queued operation: shard/operations/等问题,详情如下: Server Log INFO: DispatchedMonitor: Testin…...
论文阅读:MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model
论文标题: MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model 翻译: MedSegDiff:基于扩散概率模型的医学图像分割 名词解释: 高频分量(高频信号)对应着图像变化剧烈的部分&…...
openssl加解密-干货分享
0.需要包含的头文件和预定义常量 #include <openssl/rand.h>#include <fstream>#include <openssl/aes.h>#include <openssl/rand.h>// 加密密钥和初始化向量(IV)长度#define AES_KEY_LENGTH 32#define AES_IV_LENGTH 16 1.密…...
【考研数据结构代码题7】求一元多项式之和
题目:编写一个算法,求一元多项式之和 考纲:一元多项式的表示与相加 题型:代码填空或算法设计 难度:★★★ 参考代码 typedef struct node{float coef;//系数int exp;//次数struct node *next; }polynode; polynode *…...
python避坑指南(更新中)
os.path.join 避免连续的/,看示例即清楚,最好的避免方法是字符串首末都不要加’/: join用法 用join前面的符号将参数数组里面的字符串连接起来,注意join只有一个参数...
可以远程控制电脑桌面的软件有哪些?
随着电脑办公的普及,人们对于远程控制电脑的需求也越来越大。远程控制电脑技术能够让用户在不同地点的电脑之间进行操作和访问,能够提高工作效率。可以远程控制电脑桌面的软件有哪些? 1. 远程监控电脑软件 需要安装在被控制端电脑ÿ…...
洛谷 P1250 种树
种树 题目背景 一条街的一边有几座房子,因为环保原因居民想要在路边种些树。 题目描述 路边的地区被分割成块,并被编号成 1 , 2 , … , n 1, 2, \ldots,n 1,2,…,n。每个部分为一个单位尺寸大小并最多可种一棵树。 每个居民都想在门前种些树&#…...
java大视频在线预览(支持断点下载)
1.说明 大视频的在线预览,如果不支持断点下载,将无法在苹果手机上播放,同时不支持进度条拖动. 之所以这样,是因为视频文件太大了,通过二进制流向浏览器传输时,整个文件尚未传输完成时,会被浏览器强制关闭流,不再接收,等缓存播放到一定程度时,浏览器会再次向后端请求视频文件,同…...
OpenCV入门10——特征点检测与匹配
文章目录 特征检测的基本概念Harris角点检测Shi-Tomasi角点检测SIFT关键点检测SIFT计算描述子SURF特征检测OBR特征检测暴力特征匹配FLANN特征匹配实战flann特征匹配图像查找图像拼接基础知识图像拼接实战 特征点检测与匹配是计算机视觉中非常重要的内容。不是所有图像操作都是对…...
教育机构拒绝“数据陷阱”,群硕将英孚新一代教学管理系统搬上桌
为什么小机构年年担心招生不够,英孚却令学生家长趋之若鹜? 区别就在教学管理方式。为了更好地管理分布全球的校区、学生和老师,英孚应用了一套教学管理系统,帮助学校管理学员,帮老师智慧排课,帮助家长记录…...
小辰的智慧树(差分+前缀和)
登录—专业IT笔试面试备考平台_牛客网 1.考虑总长度之和不能超过m,2考虑限制每棵树高度不能低于ci,如果用二分最短输能截到的高度,还要另外去判断,是否每棵树mid都能严格大于ci ,这样容易超时,换个角度&…...
Windows如何使用key登录Linux服务器
场景:因为需要回收root管理员权限,禁止root用户远程登录,办公环境只允许普通用户远程登录,且不允许使用密码登录。 一、生成与配置ssh-key 1.使用root管理员权限登录到目标系统。 2.创建一个新的普通用户,和设置密码用…...
k8s无法删除pv,pvc问题
问题: 在k8s里面创建了pv,pvc删除时报错:error: resource(s) were provided, but no name was specified 解决: 正确的删除顺序:1.先删除pod2.再删除pv 3.在删除pvc 删除pv,pvc命令: kubect…...
基于框架的线性回归
线性回归是机器学习中最简单和最常用的回归方法之一。它建立了自变量和因变量之间的线性关系,并通过拟合一条直线或超平面来预测和分析数据。 基于框架的线性回归是构建线性回归模型的一种常见方法,它利用现有的机器学习框架来实现线性回归模型的建立、…...
题解:AtCoder AT_awc0006_e Store Sales Management
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…...
终极指南:PoeCharm - 流放之路中文版BD构建神器,让角色规划精准高效
终极指南:PoeCharm - 流放之路中文版BD构建神器,让角色规划精准高效 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 还在为《流放之路》复杂的BD构建而头疼吗?Po…...
告别卡顿与臃肿:G-Helper终极指南,让华硕笔记本重获新生
告别卡顿与臃肿:G-Helper终极指南,让华硕笔记本重获新生 【免费下载链接】g-helper The control app every laptop should come with. G-Helper is a fast, native tool for tuning performance, fans, GPU, battery, and RGB on any Asus laptop or han…...
Winhance中文版:你的Windows系统优化终极指南 [特殊字符]
Winhance中文版:你的Windows系统优化终极指南 🚀 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winha…...
微信聊天记录永久保存:三步导出完整指南
微信聊天记录永久保存:三步导出完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg 你是…...
公司IT限制下如何搞定WSL?记一次从零搭建Linux编译环境的实战经历
企业IT限制下的WSL生存指南:从零构建Linux开发环境 作为一名开发者,当你兴奋地准备在Windows上通过WSL搭建Linux编译环境时,公司IT部门的种种限制往往会成为意想不到的障碍。网络代理、组策略、驱动映射——这些企业级安全措施虽然保护了公司…...
别再只会用fillna了!Pandas数据预处理实战:缺失值、离散化、归一化与相关性分析保姆级教程
Pandas数据预处理实战:从缺失值处理到特征工程的完整指南 当你面对一个来自真实业务场景的脏数据集时,是否经常感到无从下手?数据预处理占据了数据科学项目80%的工作量,而Pandas作为Python生态中最强大的数据处理工具,…...
C语言中常用的几个头文件及库函数
不完全统计,C语言标准库中的头文件有15个之多,所以我主要介绍常用的这四个头文件stdio.h,string.h,math.h,stdlib.h,以后用到其他的再做补充。下面上干货:1.<stdio.h>:定义了输入输出函数、类型以及宏࿰…...
5款降AI神器综合性价比盘点:速度+效果+售后哪款最值毕业生选?
降 AI 神器这个词被用得太泛,导致很多工具都自称神器但综合性价比一塌糊涂。 这次盘点用一个简单的标准——速度 效果 售后这三维度都不弱的才能上榜。综合性价比最高的三款是嘎嘎降AI(www.aigcleaner.com)、比话降AI(www.bihu…...
LayUI表格(table)模块深度使用指南:从静态数据渲染到服务端分页与行内编辑
LayUI表格模块实战指南:从基础渲染到高级交互 1. 初识LayUI表格模块 在现代Web开发中,数据表格是展示结构化信息最常用的组件之一。LayUI作为一款轻量级的前端UI框架,其表格(table)模块凭借简洁的API和丰富的功能,成为众多开发者的…...
