РТИ 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.
Итак: Глубокое копирование, а затем выпуск кредита.