РТИ DDS освобождение памяти

Мне сказали, что 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);
        }
    }
}

Нужно ли использовать метод copy_from до передачи DTO остальной части моего кода? Было дано объяснение, что RTI поддерживает ссылку на DTO и будет просто обновлять поля при получении новых данных вместо создания нового HelloWorld DTO. В объяснении говорилось, что DTO не будут работать должным образом, если они не будут явно выпущены, сначала выполнив копию (поэтому я не держу ссылку на оригинал) и вызвав return_loan для читателя. Это не имеет смысла для меня, так как я ожидаю, что ссылки будут очищены после очистки последовательности.

Это точно? Мне действительно нужно копировать каждый раз, когда приходит DTO? Я бы предпочел минимизировать накладные расходы, если это возможно, поскольку эти DTO будут отправляться с относительно высокой скоростью.

1 ответ

Решение

Да (copy_from) или извлеките информацию, которую вы ищете, а затем release_loan.

Внутренне вы используете данные, управляемые промежуточным программным обеспечением.

Когда вы находитесь между take (или read) и release_loan, гарантируется, что данные находятся в согласованном состоянии.

Если у вас есть ссылка на внутреннюю (DDS) память и release_loan, как вы узнаете, что данные, которые вы просматриваете (позднее), не обновляются? (в Java вы получаете исключения одновременного доступа к памяти в любом случае).

Имейте в виду, что внутренности, с которыми вы работаете, не являются Java, они хранятся в библиотеке ac (соединение JNI). Единственный способ, которым Connext обеспечит согласованность и согласованность данных, - использование механизма loan/release_loan.

Итак: Глубокое копирование, а затем выпуск кредита.

Другие вопросы по тегам