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

news2024/12/27 12:07:41

目录

  • 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.coloradmin.cn/o/542382.html

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

相关文章

I2C总线

基于linux-3.14.16 一、注册I2C总线 以上代码即完成了i2c总线的注册&#xff0c;并且添加了一个i2c驱动dummy_driver 二、注册适配器 1、平台总线匹配 设备树有i2c1设备 平台总线匹配后执行probe 2、执行probe 获取中断号 获取地址资源并映射 填充i2c_adapter&#…

chatgpt赋能Python-python3_7如何安装matplotlib

Python3.7如何安装Matplotlib Matplotlib是一个Python的绘图库&#xff0c;可以帮助用户制作2D和3D图表和图形。它利用了NumPy、SciPy和其他Python包&#xff0c;具有出色的兼容性和可视化效果&#xff0c;广泛应用于数据分析、科学计算和工程领域。在本篇文章中&#xff0c;我…

chatgpt赋能Python-python2转3

Python2转3的最终结论 Python是一种流行的编程语言&#xff0c;但随着Python 2的维护结束&#xff0c;许多开发者正在考虑将他们的代码从Python 2升级到Python 3。这篇文章将介绍如何在搜索引擎优化&#xff08;SEO&#xff09;方面实现Python 2转3&#xff0c;并讨论为什么这…

页面样式问题收集及解决方案导航

1、el-table表头文字换行https://blog.csdn.net/qq_44747461/article/details/105976042 2、element-ui动态更改el-table某个单元格字体颜色&#xff1a;https://blog.csdn.net/agua001/article/details/107960393 Element UI 表格 el-table-column根据不同值显示不同颜色&…

ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)

ChatGPT工作提效之程序开发中的巧劲 前言一、创建MySQL数据表1.创建指令2.交互评价 二、PHP交互语句1.创建指令2.交互评价 三、javascript的交互用法1.创建指令2.交互评价 四、python的交互1.创建指令2.交互评价 总结 前言 ChatGPT是一个基于GPT模型训练的聊天机器人&#xff…

【Maven从入门到入土】

文章目录 1.Maven1.1 初识Maven依赖管理&#xff1a;统一项目结构 :项目构建 : 1.2 Maven概述1.2.1 Maven模型1.2.2 Maven仓库1.2.3 Maven安装 1.3 IDEA集成Maven1.3.1 配置Maven环境1.3.1.1 当前工程设置1.3.1.2 全局设置 1.3.2 Maven项目1.3.2.1 创建Maven项目1.3.2.2 POM配置…

代码随想录训练营Day37| 738.单调递增的数字 968.监控二叉树 总结

目录 学习目标 学习内容 738.单调递增的数字 968.监控二叉树 总结 学习目标 738.单调递增的数字 968.监控二叉树 总结 学习内容 738.单调递增的数字 738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/monotone-increasing-di…

【云计算与虚拟化】第二章 实验二 Vmware Workstation 15的使用

实验二 Vmware Workstation 15的使用 在上一实验的基础上&#xff0c;将两台虚拟机调节到在桥接模式下&#xff0c;配置相应的网络参数&#xff0c;实现虚拟机1和2能相互通信&#xff0c;虚拟机1和2能够ping通外网&#xff0c;虚拟机1和2能ping通物理机。 &#xff08;截取…

GE SR469-P5-HI-A20 带有5A相CT次级线圈的标准装置

SR469-P5-HI-A20提供四路4-20 mA模拟输出。该装置已通过CE认证。这是一个带有5A相CT次级线圈的标准装置。该装置的控制电源额定为90-300伏直流电&#xff0c;70-265伏交流电&#xff0c;48-62赫兹。 制造商美国通用电气公司&#xff0c;通用工业系统电压供应交流电:48-62赫兹时…

【云计算与虚拟化】第四章 实验一 在Windows 系统部署vCenter Server

实验一 在Windows 系统部署vCenter Server 1.部署两台ESXi6.0 虚拟主机&#xff0c;其余参数可以参考实验IP拓扑 2.在Windows Server 2012 R2中部署Storge服务器,该服务器名字为&#xff1a;姓名的拼音的首字母1&#xff0c;且要实现以下三个功能&#xff1a; (1)AD域控制…

【5.15】一、软件测试基础—软件概述

目录 1.1 软件概述 1.1.1 软件生命周期 1.1.2 软件开发模型 1.1.3 软件质量概述 1.1 软件概述 软件是相对于硬件而言的&#xff0c;它是一系列按照特定顺序组织的计算机数据和指令的集合。 软件的生命周期&#xff1a;软件从“出生” 到 “消亡” 的过程。 1.1.1 软件生…

超详细!Xmind的学习

哈喽&#xff0c;大家好。最近有小伙伴问使用xmind思维导图怎么快速上手&#xff0c;今天便给各位小伙伴出了这一期快速上手教程。思维导图的上手其实都是很简单的&#xff0c;只要知道基本功能的使用&#xff0c;基本上半天就能学会&#xff0c;一天就能熟练。 一、学习准备 …

【SpringBoot整合JWT】

目录 一、什么是JWT 二、JWT能做什么 三、为什么是JWT 1、基于传统的Session认证 2、基于JWT认证 四、JWT的结构是什么 五、JWT的第一个程序 六、封装JWT工具类 七、整合SpringBoot使用 一、什么是JWT JSON Web Token (JWT) is an open standard ([RFC 7519](http…

chatgpt赋能Python-python2转换为python3

Python 2到Python 3的转换和优化 在过去的几年中&#xff0c;Python 3已经成为了最流行的Python版本。因此&#xff0c;Python 2用户开始转向Python 3&#xff0c;以提高性能、安全性和可靠性。本文将讨论Python 2到Python 3的转换以及一些实用的优化技巧。 为什么要转向Pyth…

chatgpt赋能Python-python3_0列表排序方法

Python 3.0列表排序方法介绍 Python是一门广泛应用、适应性强的编程语言&#xff0c;而Python由于其简洁明了、易于学习、适合初学者的特点&#xff0c;是许多人最喜欢的编程语言之一。 Python 3.0列表排序方法是许多Python爱好者和开发者常用的功能之一。Python 3.0列表排序…

计算机网络 IP 1.1 IP基础知识

1. IP基本认识 网络层是实现主机与主机之间的通信。也叫点对点通信。 网络层(IP)和数据链路层&#xff08;网络接口层&#xff09;(MAC)有什么区别&#xff1f; IP是负责在没有直连的两个网络之间进行通信&#xff0c;MAC负责两个直连设备之间的通信。 只有两者一块使用&…

EasyRecovery Photo16数据恢复软件免费版下载或使用方法及安装激活教程

EasyRecovery Photo16数据恢复软件免费版下载是一款支持Mac/Wind平台进行恢复图片的专业工具&#xff0c;尤其是各种流行单反相机RAW格式文件&#xff0c;以及超大型视频文件等&#xff0c;摄影爱好者使用。EasyRecovery是一款非常专业的硬盘数据恢复工具&#xff0c;可以帮你恢…

windows搭建pyspark环境详细教程

一.安装jdk及配置环境变量: 下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8-windows 安装步骤&#xff1a; 下载后点击安装&#xff0c;中途可以自定义安装路径&#xff0c;最后查看安装路径&#xff1a; 开始配置系统环境变量&#xff1a…

IS215UCVEM08B US2000型处理器板

IS215UCVEM08B US2000型处理器板通用电气标志VI卡 这IS215UCVEM08B是一种印刷电路板&#xff0c;是通用电气公司制造的Mark VI Speedtronic涡轮系列的一部分。这IS215UCVEM08B有一个小的圆形锂电池。这IS215UCVEM08B有几个链接点。电路板右手边有三个娇小的小鹿点。电路板背面…

【LLM系列之GPT】GPT(Generative Pre-trained Transformer)生成式预训练模型

GPT模型简介 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是由OpenAI公司开发的一系列自然语言处理模型&#xff0c;采用多层Transformer结构来预测下一个单词的概率分布&#xff0c;通过在大型文本语料库中学习到的语言模式来生成自然语言文本。GPT系列模…