RTI DDS内存释放

RTI DDS memory release

我听说 DDS 保留了对使用此处示例代码时创建的 DTO 的引用:

 public void on_data_available(DataReader reader) {
        HelloWorldDataReader HelloWorldReader =
            (HelloWorldDataReader)reader;

        try {
            HelloWorldReader.take(
                _dataSeq, _infoSeq,
                ResourceLimitsQosPolicy.LENGTH_UNLIMITED,
                SampleStateKind.ANY_SAMPLE_STATE,
                ViewStateKind.ANY_VIEW_STATE,
                InstanceStateKind.ANY_INSTANCE_STATE);

            for(int i = 0; i < _dataSeq.size(); ++i) {
                SampleInfo info = (SampleInfo)_infoSeq.get(i);

                if (info.valid_data) {
                    System.out.println(
                        ((HelloWorld)_dataSeq.get(i)).toString("Received",0));


                }
            }
        } catch (RETCODE_NO_DATA noData) {
            // No data to process
        } finally {
            HelloWorldReader.return_loan(_dataSeq, _infoSeq);
        }
    }
}

在将 DTO 传递给我的其余代码之前,我是否需要使用 copy_from 方法?给出的解释是,RTI 维护对 DTO 的引用,并且将在收到新数据时简单地更新字段,而不是创建新的 HelloWorld DTO。解释说明 DTO 将无法正常运行,除非通过首先执行复制(因此我没有保留对原始文件的引用)并在 reader 上调用 return_loan 来明确释放它。这对我来说没有意义,因为我希望在清除序列后清除引用。

这是准确的吗?每次 DTO 进来时我真的需要复制吗?我希望尽可能减少开销,因为这些 DTO 将以相对较高的速率发送。

是(copy_from),或提取您要查找的信息然后release_loan。

您在内部使用由中间件管理的数据。

当您在获取(或读取)和 release_loan 之间时,保证数据处于一致状态。

如果您持有对内部 (DDS) 内存的引用,并且 release_loan,您如何知道您查看的数据(稍后)不在更新过程中? (在 Java 中,无论如何都会出现并发内存访问异常)。

请记住,您正在使用的内部结构 不是 Java,它们保存在 c 库(JNI 连接)中。 Connext 确保数据一致和连贯的唯一方法是通过 loan/release_loan 机制。

所以:深拷贝然后放贷