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