我们有一种情况,有 2 个模块,一个有发布者,另一个有订阅者。发布者将使用关键属性发布一些示例。发布者是否可以阻止订阅者阅读某些样本?当具有发布者的模块当前正在更新样本时会出现这种情况,它不希望任何其他人在完成之前阅读该样本。类似互斥锁的东西。我们计划使用 Opensplice DDS,但请提供您的意见,即使它们不是特定于 Opensplice 的。谢谢。
3 回答
RTI Connext DDS 提供了一个选项来协调写入(在文档中称为“连贯写入”,请参阅第 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 */
问候,
撕
PRESENTATION Qos 不是特定的 RTI Connext DDS。它是 OMG DDS 规范的一部分。也就是说,在多个 DataWriters/Topics(而不是使用单个 DataWriter)上编写一致更改的能力是可选配置文件(对象模型配置文件)之一的一部分,因此并非所有 DDS 实现都必须支持它。
杰拉尔多
如果我正确理解您的问题,那么没有本地 DDS 机制来实现您正在寻找的东西。你写了:
当具有发布者的模块当前正在更新样本时会出现这种情况,它不希望任何其他人在完成之前阅读该样本。类似互斥锁的东西。
DDS 中没有“全局互斥锁”之类的东西。
但是,我怀疑您可以通过向数据模型添加一些信息并调整您的应用程序逻辑来实现您的目标。例如,您可以在数据中添加枚举字段;假设您添加了一个名为的字段status
,它可以采用其中一个值CALCULATING
或READY
.
在发布者方面,您的应用程序可以发布一个将status
值设置为的样本,而不是“获取互斥锁” CALCULATING
。计算完成后,可以将新样本写入status
设置为的值READY
。
在订阅者方面,您可以使用QueryCondition
withstatus=READY
作为其表达式。阅读或采取行动只能通过QueryCondition
、 使用read_w_condition()
或来完成take_w_condition()
。每当状态不等于 时READY
,订阅方将看不到任何样本。这种方法利用了新样本覆盖旧样本的机制,假设您的历史深度设置为默认值 1。
如果这会导致您正在寻找的行为,那么这种方法还有两个缺点。首先,应用程序逻辑会因使用status
字段和QueryCondition
. 不过,这很容易被抽象层隐藏。甚至可以将其隐藏在某些类似锁定/解锁的界面后面。第二个缺点是在将status
字段设置为 时,额外的样本会通过导线CALCULATING
。但是,如果您想实现类似分布式互斥锁的功能,无论如何都无法避免额外的通信。只有当您的样本非常大和/或频率很高时,这才是一个问题。在这种情况下,您可能不得不求助于一个专用的小主题来模拟锁定机制。