我们的情况是有两个模块,一个有发布者,另一个有订阅者。发布者将使用关键属性发布一些示例。出版商是否有可能阻止订阅者阅读某些样本?当具有发布者的模块当前正在更新样本时,将出现这种情况,在完成之前,它不希望任何其他人阅读。像互斥体一样的东西。 我们计划使用Opensplice DDS,但即使它们不是特定于Opensplice,也请提供您的输入。 感谢。
答案 0 :(得分:3)
RTI Connext DDS提供协调写入的选项(在文档中称为“连贯写入”,请参阅Section 6.3.10和PRESENTATION QoS。
myPublisher->begin_coherent_changes();
// (writers in that publisher do their writes) /* data captured at publisher */
myPublisher->end_coherent_changes(); /* all writes now leave */
的问候,
撕裂
答案 1 :(得分:1)
演示Qos不是特定的RTI Connext DDS。它是OMG DDS规范的一部分。这就是说,在多个DataWriters / Topics上编写连贯变化的能力(而不是使用单个DataWriter)是其中一个可选配置文件(对象模型配置文件)的一部分,因此并非所有DDS实现都必须支持它。
了Gerardo
答案 2 :(得分:1)
如果我理解你的问题,那么就没有原生DDS机制可以实现您的目标。你写道:
当具有发布者的模块当前正在更新样本时,会出现这种情况,在完成之前,它不希望任何其他人阅读。像互斥体一样。
在DDS中没有“全球互斥”这样的东西。
但是,我怀疑您可以通过向数据模型添加一些信息并调整应用程序逻辑来实现目标。例如,您可以为数据添加枚举字段;假设您添加了一个名为status
的字段,它可以采用其中一个值CALCULATING
或READY
。
在发布商方面,您的应用可以发布status
值设置为CALCULATING
的示例,而不是“使用互斥锁”。计算完成后,可以使用status
设置为READY
的值写入新样本。
在订阅方,您可以使用QueryCondition
作为其表达式status=READY
。只应使用QueryCondition
或read_w_condition()
通过take_w_condition()
进行阅读或采取行动。只要状态不等于READY
,订阅方就不会看到任何样本。假设您的历史深度设置为默认值1,此方法利用了较新样本覆盖旧样本的机制。
如果这导致您正在寻找的行为,那么此方法还有两个缺点。首先,使用status
字段和QueryCondition
会对应用程序逻辑造成一定程度的污染。但是,这很容易被抽象层隐藏。甚至可以将它隐藏在一些类似锁定/解锁的界面之后。第二个缺点是由于在将status
字段设置为CALCULATING
时额外的样本通过电线。但是,如果您想要实现类似分布式互斥体的功能,则无法避免额外的通信。只有当您的样本非常大和/或频繁时,这才是问题所在。在这种情况下,您可能不得不求助于专用的小主题,以达到模拟锁定机制的唯一目的。