OMG Data Distribution Service(DDS)规范解读-Part4

news/2024/4/28 18:57:55/文章来源:https://blog.csdn.net/weixin_42299076/article/details/130741269

目录

  • 2.4 Listeners, Conditions, and Wait-sets
    • 2.4.1 Communication Status
    • 2.4.2 Changes in Status
      • 2.4.2.1 Plain communication statuses
      • 2.4.2.2 Read Communication Statuses
    • 2.2.4.3 Access through Listeners
      • 2.2.4.3.1 Listener Access to Plain Communication Status
      • 2.2.4.3.2 Listener Access to Read Communication Status
    • 2.2.4.4 Conditions and Wait-sets
      • 2.2.4.4.1 Trigger State of the StatusCondition
    • 2.2.4.5 Trigger State of the ReadCondition
      • 2.2.4.5.1 Trigger State of the GuardCondition
    • 2.2.4.6 Combination
    • 学习资料链接

2.4 Listeners, Conditions, and Wait-sets

Listeners和Conditions(和wait set相关)是两种允许APP知道DCPS有change的机制。

2.4.1 Communication Status

Communication Status是和Entity关联的,下表列出了所有Entity会有的status:
Communication Status以上的status可以被分为两类:

  • Read communication statuses:和data数据有关的,比如DATA_ON_READERS和DATA_AVAILABLE
  • Plain communication statuses:其他所有

Read communication statuses不会独立出现,也就是说,至少会有两个status会被同时改变,例如DATA_ON_READERS + DATA_AVAILABLE。这些改变(grouping)会被发给APP,如何操作取决于下面两种不同机制。
对于每一个Plain communication statuse来说,都会有相关的结构去控制相关的status的值。这些值与status的改变相关,也和这些status本身有关(例如,包含累积计数)。与下文解释的两种不同机制一起使用。

status value上图对应了不同的status里面包含的值及其数据类型。

2.4.2 Changes in Status

每个entity的communication status都关联一个StatusChangedFlag
此flag指示自上次APP“read”该状态以来,该特定通信状态是否发生了更改

2.4.2.1 Plain communication statuses

对于Plain communication statuses,StatusChangedFlag默认为FALSE,只有当状态改变才会设置为TRUE,并且当每次APP调用get_<plain communication status>接口时都会重置成FALSE。
changeflag每当调用关联的listener操作时,通信状态也被重置为FALSE,因为侦听器隐式访问作为参数传递给操作的状态。
此规则的一个例外是当关联的侦听器是’ nil ‘listener时。’ nil ‘时,线程认为是NOOP,并且’ nil '不会重置通信状态。

举例:
REQUESTED_DEADLINE_MISSED 的flag会变成TRUE,每当新的deadline发生的时候(也会增加total_count)。当调用get_requested_deadline_missed_status时,flag又会重置为FALSE。

2.4.2.2 Read Communication Statuses

对于Read Communication Statuses,StatusChangedFlag默认为FALSE。
StatusChangedFlag在data-sample到达或任何现有sample的ViewState, SampleState或InstanceState因任何原因而更改时变为TRUE,而不是调用DataReader::read, DataReader::take或它们的变体。

下面的事件会使得StatusChangedFlag变为TRUE:

  1. 新data的到来;
  2. InstanceState 的改变
    • 如DataWriter的OWNERSHIP QoS kind=EXLUSIVE,则通知实例已被拥有该实例的DataWriter处置;
    • 如DataWriter的OWNERSHIP QoS kind=SHARED,则通知实例已被任何DataWriter处置;
    • instance只有一个DataWriter,该DataWriter的liveliness已丢失;
    • 已知正在写入实例的唯一DataWriter unregistered实例的通知到达。

下面的事件会使得StatusChangedFlag变为FALSE:

  1. DATA_AVAILABLE 的StatusChangedFlag 变成FALSE:当相关的listener调用on_data_available或调用read/take操作;
  2. DATA_ON_READERS 的StatusChangedFlag 变成FALSE:
    • 当相关的listener调用on_data_on_readers;
    • on_data_available被DataReader所属的Sub调用;
    • read/take操作被调用

在这里插入图片描述

2.2.4.3 Access through Listeners

listener提供的是异步的通知,提供的接口如下图:
在这里插入图片描述

2.2.4.3.1 Listener Access to Plain Communication Status

2.2.4.3.2 Listener Access to Read Communication Status

2.2.4.4 Conditions and Wait-sets

conditions提供一种中间件能够与APP通信Communication Status改变的方式。

  • APP会创建一些感兴趣的condition(StatusCondition,ReadCondition or QueryCondition),并将它们加到WaitSet中。
  • 然后APP会wait,直到一个或多个condition的trigger_value变为TRUE。
  • 获取trigger_value变为TRUE的condition的list,使用以下的操作:
    • 相关的Entity:get_status_changes 之后 get_<communication_status>。如果是一个StatusCondition和他状态的改变,参考plain communication status。
    • 相关的Subscriber:get_status_changes之后get_datareaders。如果是一个StatusCondition和他状态的改变,参考 DATA_ON_READERS。
    • 相关的DataReader:get_status_changes之后 read/take。如果是一个StatusCondition和他状态的改变,参考 DATA_AVAILABLE。
    • 相关的DataReader:如果是ReadCondition 或 QueryCondition,直接使用read_w_condition/take_w_condition。

由于在等待返回时没有额外的信息从中间件传递到应用程序(只有触发的Condition对象列表),Condition对象意味着嵌入在启用时正确响应所需的所有信息。特别是,实体相关的条件只与一个实体相关,不能共享。
WaitSet的blocking操作的行为如下图:
在这里插入图片描述与listeners的调用类似,在唤醒WaitSet时没有隐含的“事件排队”,也就是说,如果附加到WaitSet的几个条件的trigger_value按顺序转换为TRUE,则DCPS实现只需要解除一次WaitSet的阻塞。

2.2.4.4.1 Trigger State of the StatusCondition

StatusCondition的trigger_value是其敏感的所有通信状态的ChangedStatusFlag的布尔或值。trigger_value==FALSE只在所有flag都为FALSE时才可能出现。
StatusCondition对特定通信状态的敏感性由set_enabled_statuses操作在条件上设置的enabled_statuses列表控制。

2.2.4.5 Trigger State of the ReadCondition

与StatusCondition意义,ReadCondition也有trigger_value,这是决定着WaitSet的状态为BLOCKED 或 UNBLOCKED。然而,与StatusCondition不同的是,ReadCondition的trigger_value与至少存在一个由Service管理的样本相关联,其中SampleState、ViewState和InstanceState与ReadCondition的样本相匹配。此外,为了使QueryCondition具有trigger_valueTRUE,与sample相关联的数据必须使query_expression的计算结果为TRUE。
ReadCondition的trigger_value取决于相关DataReader上存在的样本,这意味着单个take()操作可能会改变几个ReadCondition或QueryCondition条件的trigger_value。例如,如果take了所有samples,那么之前与DataReader关联的任何ReadCondition和QueryCondition条件的trigger_value
TRUE将会看到trigger_value变为FALSE。注意,这并不能保证单独附加到这些条件的WaitSet对象不会被唤醒。一旦我们在可能唤醒附加的WaitSet的条件上设置了trigger_valueTRUE,那么将条件转换为trigger_valueFALSE并不一定会“唤醒”WaitSet,因为通常情况下“唤醒”可能是不可能的。结果是,阻塞在WaitSet上的应用程序可能会从等待返回一个条件列表,其中一些条件不再是“active”。如果多个线程并发地等待单独的WaitSet对象并获取与相同DataReader实体关联的数据,这是不可避免的。
为了进一步详细说明,请考虑以下示例:只要有新的样本到达,具有SAMPLE_STATE_MASK={NOT_READ}的ReadCondition就会有TRIGGER_VALUE为TRUE,并且只要所有新到达的样本都被读取(因此它们的状态更改为READ)或被获取(因此它们不再由服务管理),ReadCondition就会转换为FALSE。 然而,如果相同的ReadCondition具有SAMPLE_STATE_MASK={READ,NOT_READ},则Trigger_Value只有在获取了所有新到达的样本后才会变为FALSE(读取它们是不够的,因为这只会将SampleState更改为READ,这与ReadCondition上的掩码重叠。

2.2.4.5.1 Trigger State of the GuardCondition

通过 set_trigger_value改变APP的行为.

2.2.4.6 Combination

这两种机制会组合使用.使用WaitSet和Condition访问数据,并向listener发出错误通信状态的异步警告。
很可能应用程序将为每个特定的通信状态选择一种或另一种机制(而不是两种)。
但是,如果两种机制都启用,则首先使用侦听器机制,然后用信号通知WaitSet对象。

学习资料链接

  1. FastDDS相关介绍
  2. OpenDDS 监听器(Listeners)与条件(Conditions)

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

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

相关文章

chatgpt赋能Python-python3_8怎么安装matplotlib

Python3.8怎么安装Matplotlib Matplotlib是一个非常流行的Python可视化库&#xff0c;它可以用来创建各种类型的图形&#xff0c;包括线图、散点图、直方图、饼图和热图等等。在本文中&#xff0c;我们将介绍如何在Python3.8中安装Matplotlib&#xff0c;以及如何使用它来绘制…

chatgpt赋能Python-python3_7_1如何使用

Python 3.7.1使用指南 Python自从出现以来&#xff0c;已经成为了一个非常流行的编程语言&#xff0c;每年都会更新版本以满足不断变化的市场需求。其中最新版本是Python 3.7.1&#xff0c;它与其前身相比提供了许多改进和新功能&#xff0c;同时也解决了一些已知的问题。本文…

Spark大数据处理讲课笔记4.6 Spark SQL数据源 - JDBC

文章目录 零、本讲学习目标一、Spark SQL读取关系数据库二、Spark SQL JDBC连接属性三、创建数据库与表&#xff08;一&#xff09;创建数据库&#xff08;二&#xff09;创建学生表&#xff08;二&#xff09;创建成绩表 四、读取和写入数据库表&#xff08;一&#xff09;利用…

Xcode真机运行报错:Failed to prepare the device for development解决方法

一、遇到的问题 运行Xcode然后打包APP&#xff0c;结果Xcode报错&#xff0c;如下&#xff1a; Failed to prepare the device for development. This operation can fail if the version of the OS on the device is incompatible with the installed version of Xcode. You …

macOS Ventura 13.4 (22F66) 正式版发布,ISO、IPSW、PKG 下载

本站下载的 macOS Ventura 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 请访问原文链接&#xff1a…

chatgpt赋能Python-python3_8_5安装后怎么打开

Python3.8.5安装后怎么打开&#xff1a;简易步骤指南 Python是一种高级编程语言&#xff0c;被广泛用于数据分析、机器学习、自动化、网络编程等多个方面。Python语言优雅简洁&#xff0c;易于上手&#xff0c;是编程初学者的最佳入门语言之一。本文将介绍Python3.8.5版本的安…

管道通信,共享内存

什么是有名管道 有名管道&#xff08;Named Pipe&#xff09;是一种特殊的文件类型&#xff0c;也称为 FIFO。它提供了一种进程间通信的机制&#xff0c;允许不相关的进程通过读写共享的文件来交换数据。 与普通文件不同的是&#xff0c;有名管道在文件系统中存在一个路径名&…

redis单机版本Java代码实践

pom依赖 引入redis的starter以及commons-pool2的依赖&#xff0c;commons-pool2是配置连接池需要使用的&#xff0c;不引入&#xff0c;只有连接池配置是不会创建连接池的 <!-- redis --><dependency><groupId>org.springframework.boot</groupId><…

基于协同过滤的推荐算法

基于协同过滤的推荐算法 基于协同过滤&#xff08;CF&#xff09;的推荐基于近邻的协同过滤基于用户的协同过滤&#xff08;User-CF&#xff09;基于物品的协同过滤&#xff08;Item-CF&#xff09;User-CF 和 Item-CF 的比较基于协同过滤的推荐优缺点基于模型的协同过滤隐语义…

python类的高级函数

类的高级函数 __str__ 如果定义了该函数&#xff0c;当print当前实例化对象的时候&#xff0c;会返回该函数的return信息 用法&#xff1a; def __str__(self): return str_type 参数&#xff1a;无 返回值&#xff1a;一般返回对于该类的描述信息 __getattr__ 当调用的…

JavaWeb-RequestResponse的使用

Request&Response 今日目标 掌握Request对象的概念与使用掌握Response对象的概念与使用能够完成用户登录注册案例的实现能够完成SqlSessionFactory工具类的抽取 1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。这两个对象在我们…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-7

深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践-总结-7 类文件结构概述无关性的基石 虚拟机类加载机制概述类加载的时机 类文件结构 代码编译的结果从本地机器码转变为字节码&#xff0c;是存储格式发展的一小步&#xff0c;却是编程语言发展的一大步 概述 我们写的程…

在阿里做了6年软件测试,4月无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入阿里&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是6年的工作经验吧。 这6年之间完成了一次…

060:cesium设置网格Grid材质

第060个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置网格材质,请参考源代码,了解GridMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共93行)相关API参考:专栏目标示例效…

chatgpt赋能Python-python3_9_6怎么用

Python 3.9.6简介 Python 3.9.6是2021年6月28日发布的Python编程语言的最新版本&#xff0c;它提供了一些有用的新功能和改进&#xff0c;包括优化的解释器性能和可变构造体。它是一种功能强大的编程语言&#xff0c;既易于学习又易于使用&#xff0c;非常适用于开发Web应用程…

SaaS 产品如何选择设计协作工具?

文章内容转载腾讯 CoDesign 随着互联网及其衍生技术的发展&#xff0c;企业比以往更依赖内容去吸引、去培养自己的用户&#xff0c;寻求转化。小鹅通就是在微信生态中帮助企业通过知识服务去实现内容分发和流量聚合&#xff0c;帮助企业沉淀用户&#xff0c;提供深度私域运营服…

自定义颜色编辑选取对话框

一、简介 Qt中已经有一些封装好的对话框&#xff0c;比如QMessageBox、QColorDialog等&#xff0c;使用起来快捷方便&#xff0c;但缺点是我们无法为它们自定义样式&#xff0c;所以可能难以“融入”我们的项目。既然如此&#xff0c;那就自己做一个把。抱着这样的想法&#x…

如何成功申请计算机软件著作权【申请流程完整记录】

致谢 &#xff1a;此博文的编写包括软著的申请&#xff0c;均借鉴了大佬【万里守约】的博客 — 提示&#xff1a;此博文仅适合个人申请&#xff0c;因为我是自己一个人的项目&#xff0c;自己一个人申请软著 文章目录 前言&#xff1a;一、网站注册与实名认证二、材料准备软著申…

ChatGPT工作提效之初探路径独孤九剑遇强则强

ChatGPT工作提效之遇强则强 前言一、如何使用ChatGPT二、ChatGPT实战应用三、ChatGPT会叫的小孩有奶吃工具类的交互问答类的交互开发类的交互 前言 读《笑傲江湖》西湖比剑时&#xff0c;对于独孤九剑1的解读印象颇为深刻。令狐冲被任我行这个高手激发出许多精妙的剑招。这独孤…

nvm-windows安装和配置

1.下载nvm-windows https://github.com/coreybutler/nvm-windows/releases 进入后如下图 选择nvm-setup.exe下载 2.安装 2.1 运行安装包&#xff0c;同意协议&#xff0c;下一步 2.2 选择nvm的安装目录&#xff0c;安装路径名最好不要有空格 2.3 点击Next&#xff0c;设…