DataSharingQosPolicy
DataSharingQosPolicy 是一个额外的QoS(质量服务)策略,用于配置数据共享交付通信方式,主要用于 Writer 和 Reader 之间的数据传输。此策略可以有效地支持在多个进程或线程之间共享数据。
QoS 策略数据成员列表:
数据成员 | 类型 | 访问器 | 默认值 |
---|---|---|---|
数据共享种类 | DataSharingKind | kind() | AUTO |
共享内存目录 | string | shm_directory() | 空字符串 |
最大域数量 | uint32_t | max_domains() | 0 (无限) |
数据共享域ID | vector |
domain_ids() | 空 |
数据共享监听线程设置 | ThreadSettings | data_sharing_listener_thread() |
数据共享种类说明:
- Data-sharing kind:指定数据共享交付的行为。具体描述请参考
DataSharingKind
。 - Shared memory directory:用于内存映射文件的目录。如果未配置,则使用系统默认目录。
- Maximum domain number:规定本地或远程端点中最大的数据共享域ID数量。如果该值低于任何远程端点ID列表的大小,则匹配可能会失败。值为零表示无限制。
- Data-sharing domain IDs:为当前
DataWriter
或DataReader
配置的数据共享域ID列表。如果未提供ID,系统将为当前机器创建一个唯一ID。 - Data-sharing listener thread settings:用于监听入站流量的数据共享线程的设置。
注意事项:
此QoS策略适用于 DataWriter
和 DataReader
实体,并且不能在启用实体上更改。
DataSharingKind
有三个可能的值(参见 DataSharingKind
):
- OFF:禁用数据共享交付,不会执行任何通过数据共享功能进行的通信。
- ON:手动启用数据共享交付。如果当前主题不兼容,将产生错误;与至少一个共同数据分享域ID的远程实体之间将通过数据分享功能进行通信。
- AUTO:如果当前主题兼容,将激活数据分享;否则,将被停用。
数据共享配置助手函数
为了设置数据共享交付配置,必须使用以下辅助成员函数之一,每个函数对应一种 DataSharingKind
风格:
函数 | 导致的数据分享种类 |
---|---|
automatic() | AUTO |
on() | ON |
off() | OFF |
您可以在这些助手函数中定义数据共享域ID,也可以使用 add_domain_id()
函数稍后添加。请注意,添加新域ID算作修改QoS策略,因此必须在启用实体之前完成。
示例
以下是如何配置和使用 DataSharingQosPolicy
的示例代码:
// 此示例使用 DataWriter,但也可应用于 DataReader 实体
DataWriterQos writer_qos;
// 默认情况下,DataSharing 设置为 AUTO,这意味着如果主题兼容,将使用 DataSharing。
// 如果未指定 Shared Memory 目录,则将使用默认目录。
// 配置 DataSharing 为 ON,以启用并指定必需的 shared memory 目录
writer_qos.data_sharing().on("/path/to/shared_memory/directory");
// 或者,配置 DataSharing 为 OFF 来禁用它
writer_qos.data_sharing().off();
// 将 DataSharing 配置为 AUTO,并添加两个用户定义的 ID(也可与 ON 一起使用)
std::vector<uint16_t> ids;
ids.push_back(0x1234);
ids.push_back(0xABCD);
writer_qos.data_sharing().automatic(ids);
// 或逐个添加 ID
writer_qos.data_sharing().add_domain_id(uint16_t(0x1234));
writer_qos.data_sharing().add_domain_id(uint16_t(0xABCD));
// 或者可以保持 ID 列表为空,系统会自动创建一个唯一 ID
// 设置最大域数为5. 设置为0表示'无限'
writer_qos.data_sharing().set_max_domains(5);
// [可选] 听线程的 ThreadSettings 设置
writer_qos.data_sharing().data_sharing_listener_thread(eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1});
// 使用修改后的 QoS 创建相应实体
writer_ = publisher_->create_datawriter(topic_, writer_qos);
这段代码展示了如何通过各种方式配置和应用 DataSharingQosPolicy
。
内容由零声教学AI助手提供,问题来源于学员提问