AUTOSAR_EXP_ARAComAPI的5章笔记(13)

news2024/11/22 18:58:50

☞返回总目录

5.4.7 事件(Events)

在骨架侧,服务实现负责通知事件的发生。如 5.4.2 RadarService Skeleton Class 所示,骨架为每个事件提供一个事件包装类的成员。骨架的事件包装类与代理的事件包装类看起来明显不同。

在骨架端,服务特定的事件包装类在骨架命名空间正下方的事件命名空间内定义。以示例事件BrakeEvent的事件包装类为例:

class BrakeEvent 
{
public:
    /**
     * 事件数据类型的快捷方式。
     */
    using SampleType = RadarObjects;

    ara::core::Result<void> Send(const SampleType &data);

    ara::core::Result<ara::com::SampleAllocateePtr<SampleType>> Allocate();

    /**
     * 发送数据后,您将失去所有权,并且无法再通过 SampleAllocateePtr 访问数据。
     * SampleAllocateePtr 的实现将具有 std::unique_ptr 的语义(请参阅 types.h)
     */
    ara::core::Result<void> Send(ara::com::SampleAllocateePtr<SampleType> data);
};

与代理侧类似,using指令为事件的具体数据类型引入了通用名称SampleType。我们提供了Send()方法,有两个不同变体,用于发送新的事件数据。

  • 第一个变体

第一个变体接受一个SampleType的引用。这种变体很直接:事件数据已由服务应用程序开发人员在某处分配,并通过引用传递给Send()的绑定实现。在调用Send()返回后,调用者的数据可能会被删除或更改。绑定实现将在调用中进行复制。

疑问Send()不是服务提供者用来在事件发送更新时,把事件数据发送给其订阅者的吗?怎么调用者的数据可能会被删除或更改呢?

  • 第二个变体及相关概念

Send()的第二个变体也有一个名为data的参数,但它是类型为ara::com::SampleAllocateePtr<SampleType>。根据一般方法,只提供抽象接口,并最终建议映射提供到现有 C++ 类型(请参阅第 4.6 节),在这里引入的这个指针类型应表现得像std::unique_ptr<T>。这意味着:只有一方可以持有指针 —— 如果所有者想要放弃它,他必须通过std::move()显式地进行。

为了理解这个概念,我们必须首先查看事件包装类中的第三个方法:

ara::com::SampleAllocateePtr<SampleType> Allocate();

Allocate()提供了一种为事件数据样本分配内存的方法,它返回一个ara::com::SampleAllocateePtr<SampleType>的智能指针,该指针指向了分配的内存,可以在分配的内存写入一个事件数据样本。然后,我们可以将这个返回的智能指针传递给即将调用的Send()的第二个变体。

问题:为什么要让绑定实现Allocate()为即将给发送给潜在消费者的事件数据进行内存分配呢?

答案很简单:有优化数据复制的可能性。

下面这个夸张的例子可以让事情更清楚:假设我们这里讨论的事件(类型为RadarObjects)可能非常大,即它包含一个向量,这个向量可能会变得非常大(比如说几百千字节)。在Send()的第一个变体中,你将在应用程序进程的堆上自行分配这个事件的内存。然后 —— 在调用Send()的第一个变体期间 —— 绑定实现Send()必须将这个事件数据从(私有的)进程堆复制到一个消费者可以访问的内存位置。如果要复制的事件数据非常大,并且这种事件发生的频率很高,那么仅仅是数据复制的运行时间就可能会造成影响。

Allocate()和发送事件数据的第二个变体(Send(SampleAllocateePtr<SampleType>))相结合的想法是最终避免这种复制!一个智能的绑定实现可能会以某种方式实现Allocate()方法,使得它在一个位置分配内存,在这个位置上写入者(服务 / 事件提供者)和读取者(服务 / 事件消费者)都可以直接访问它!所以设计了一个ara::com::SampleAllocateePtr<SampleType>的指针,它指向接收者附近的内存。这样的双方都可以直接访问的位置通常被称为 “共享内存”。为了数据一致性,对这样的区域的访问应该在读取者和写入者之间进行同步。

这就是为什么Allocate()方法返回这样一个带有它所指向的数据的单一 / 唯一用户方面的智能指针:在潜在的写入者(服务 / 事件提供者端)调用了Allocate()之后,只要他将其交给Send()的第二个变体,在那里他明确地放弃所有权,他就可以访问 / 写入所指向的数据!这是必要的,因为在调用之后,读取者将访问数据并且需要一个一致的数据视图。

以下是示例代码:

using namespace ara::com;

// 我们对 RadarService 的实现 - RadarServiceSkeleton 的子类
RadarServiceImpl myRadarService;

/**
 * 在发生 BrakeEvent 时调用的处理程序
 */
void BrakeEventHandler() {
    // 让绑定为事件数据分配内存...
    SampleAllocateePtr<BrakeEvent::SampleType> curSamplePtr =
        myRadarService.BrakeEvent.Allocate();

    // 填充事件数据...
    curSamplePtr->active = true;
    fillVector(curSamplePtr->objects);

    // 现在通知消费者事件...
    myRadarService.BrakeEvent.Send(std::move(curSamplePtr));

    // 现在通过 curSamplePtr 访问数据将失败 - 
    // 我们已经放弃了所有权!
}

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

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

相关文章

论文阅读:On determining the hinterlands of China‘s foreign trade container ports

集装箱港口腹地的边界线&#xff0c;只要存在&#xff0c;就可以作为未来港口发展和基础设施规划的参考点。在早期划定中国港口腹地的努力中&#xff0c;要么考虑的港口数量有限&#xff0c;要么仅根据港口总吞吐量划定腹地。因此&#xff0c;这些研究都没有让我们清楚地了解共…

快速理解AUTOSAR CP的软件架构层次以及各层的作用

在 AUTOSAR CP 的架构中&#xff0c;软件分为 应用层 (App)、运行时环境 (RTE) 和 基础软件层 (BSW) 三个主要层级。下面是每一层的主要功能与简单的代码示例来展示它们之间的关系。 1. 概述 应用层 (App)&#xff1a;包含应用程序代码&#xff0c;主要实现业务逻辑。应用层通…

DeepFM模型代码详解

直到看到这篇文章&#xff0c;我才搞明白类别特征怎么做lookup的&#xff0c;也看明白了代码逻辑。如果你看完没懂&#xff0c;私信留下wx&#xff0c;给你讲懂。 1、Deepfm 的原理&#xff0c;DeepFM 是一个模型还是代表了一类模型&#xff0c;DeepFM 对 FM 做了什么样的改进…

【时时三省】(C语言基础)函数介绍strcat

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 strcat 字符串追加 示例&#xff1a; 比如我要把world加到hello后面去 就可以用这个 还有一种方法是这样 这两个代码的意思是一样的 只是写法不一样 写的时候要注意这些 •源字符串必须…

DAB-DETR: DYNAMIC ANCHOR BOXES ARE BETTER QUERIES FOR DETR论文笔记

原文链接 [2201.12329] DAB-DETR: Dynamic Anchor Boxes are Better Queries for DETR (arxiv.org)https://arxiv.org/abs/2201.12329 原文笔记 在本文中&#xff0c;我们提出了一种新的查询公式&#xff0c;使用动态锚框进行DETR (DEtection TRansformer)&#xff0c;并对查…

探索人工智能在数学教育上的应用——使用大规模语言模型解决数学问题的潜力和挑战

概述 论文地址&#xff1a;https://arxiv.org/abs/2402.00157 数学推理是人类智能的重要组成部分&#xff0c;人工智能界不断寻求应对数学挑战的方法&#xff0c;而在这一过程中&#xff0c;人工智能的能力需要进一步提高。从文本理解到图像解读&#xff0c;从表格分析到符号操…

大数据|MapReduce编程原理与应用

在大数据时代的浪潮中&#xff0c;MapReduce作为一种高效处理海量数据的编程模型&#xff0c;自其诞生以来便成为了数据处理领域的基石。本文旨在深入探讨MapReduce的基本原理、典型应用以及其在未来技术发展趋势中的展望&#xff0c;帮助读者更好地理解并应用这一关键技术。 一…

数制转换及交换机

数制转换 非位置化数字系统&#xff1a;罗马数字 位置化数字系统&#xff1a;二进制&#xff0c;八进制&#xff0c;十进制&#xff0c;十六进制 十进制数&#xff1a; 符号&#xff1a;2 2 2位置&#xff1a;2 1 0位权&#xff1a;该数字的真实大小 该位置上的数基数的位置…

如何设计开发RTSP直播播放器?

技术背景 我们在对接RTSP直播播放器相关技术诉求的时候&#xff0c;好多开发者&#xff0c;除了选用成熟的RTSP播放器外&#xff0c;还想知其然知其所以然&#xff0c;对RTSP播放器的整体开发有个基础的了解&#xff0c;方便方案之作和技术延伸。本文抛砖引玉&#xff0c;做个…

所有程序员的白嫖圣地-github

内容汇总 认识github页面如何从github下载资源git配置如何通过github管理工程代码 有人问github怎么用&#xff0c;几分钟了解这个每个程序员都在用的白嫖圣地。 打开github主界面&#xff0c;映入眼帘的是Home面板&#xff0c;它的作用是显示我们关注的人、点赞的项目等更新…

一款非常有用且高效的国产的Linux运维面板:1Panel介绍

1Panel介绍 一、1panel介绍二、1panel的安装1、不同系统安装2、安装日志3、访问地址 三、1panel的卸载1、停止服务2、卸载服务3、清理残留文件4、清除日志文件5、验证卸载是否成功 四、1panel的功能介绍1、服务器资源使用情况快速监控2、文件管理器简单易用3、创建和管理网站轻…

【Linux操作系统】进程等待

目录 一、什么是进程等待&#xff1f;二、为什么要进行等待&#xff1f;三、进程等待方法1.wait函数2.waitpid3.status阻塞等待和非阻塞等待&#xff08;轮询等待&#xff09;1.阻塞等待2.非阻塞等待 四、代码举例 一、什么是进程等待&#xff1f; "进程等待"是指一…

基于springboot摄影跟拍预定管理系统

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

Finops成本优化企业实践-可规划篇

引言&#xff1a;本篇假设我们要在云上新增一个应用&#xff0c;讨论其在单体、failover、DR、集群模式下的成本规划。 假设该应用base on Linux&#xff0c;硬件要求是8cores、64G mem的云主机&#xff0c;并搭配500g内存&#xff0c;至少部署在一台云主机上。我们有开发、测…

Java项目: 基于SpringBoot+mysql+maven+vue林业产品推荐系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenvue林业产品推荐系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操…

【Linux】解锁软硬链接奥秘,高效动静态库管理的实战技巧

软硬连接和动静态库 1. 软链接1.1. 概念1.2. 特点1.3. 应用场景 2. 硬链接2.1. 概念2.2. 硬链计数2.3. 特点2.4. 应用场景 3. 动静态库3.1 库存在的原因3.2. 静态库制作与使用3.2.1 打包3.2.2. 使用 3.3. 动态库制作与使用3.3.1. 打包3.3.2. 使用 4. 解决动态库查不到的4种方法…

GStreamer 简明教程(七):实现管道的动态数据流

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…

多场景多任务建模(三): M2M(Multi-Scenario Multi-Task Meta Learning)

多场景建模: STAR(Star Topology Adaptive Recommender) 多场景建模&#xff08;二&#xff09;: SAR-Net&#xff08;Scenario-Aware Ranking Network&#xff09; 前面两篇文章&#xff0c;讲述了关于多场景的建模方案&#xff0c;其中可以看到很多关于多任务学习的影子&…

OGG错误:ORA-28000:the account is locked

问题描述 问题分析 从错误看&#xff0c;应该是ogg的角色锁定了&#xff0c;需要解锁 解决方案 解锁用户 SQL> alter user GGR_OGSREPO account unlock;

【Spring】Spring实现加法计算器和用户登录

加法计算器 准备工作 创建 SpringBoot 项目&#xff1a;引入 Spring Web 依赖&#xff0c;把前端的页面放入项目中 **<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport"…