Можно ли иметь несколько объектов ORB в одном процессе?

я использую ORBacus. У меня есть многопоточное приложение, и я хочу иметь несколько объектов ORB в одном процессе. Идея заключается в следующем: каждый поток должен иметь свой собственный ORB и быть подключенным к разные сервер.

Это вообще возможно? Если так — как?


«Что вы пробовали?» : Я имею

CORBA::ORB_var m_varOrb;

в каждой теме. Каждый поток звонит. Каждый поток имеет Reconnect метод, который выполняет:

// ...
m_varOrb = CORBA::ORB_init( argc, argv );

Проблемы у меня есть:

  • когда несколько потоков пытаются восстановить соединение одновременно, приложение вылетает в m_varOrb->destroy(); или в CORBA::ORB_init,

  • Я попытался синхронизировать потоки, чтобы все потоки пытались повторно подключиться к настроенному серверу один за другим (используя static mutex) — все еще не работает — когда один поток пытается уничтожить «свой» объект ORB — снова происходит сбой destroy (некоторые утверждения не выполняются, потому что некоторые счетчики ссылок> 1; выглядит как указатель подсчета ссылок на реальный объект ORB)

  • Я добавил условное ожидание, поэтому потоки начинают звонить ORB_init только когда все потоки выполнены destroy; сделал одиночка Обертка класса вокруг ORB, синхронизировал потоки для соединения один за другим, и все стало работать отлично. НО это означает — только один шар, так только один сервер. Плохой.

Итак, все эти вещи сделали меня тем, что мне позволено иметь только один объект ORB на процесс. Я что-то пропустил?

1

Решение

По умолчанию ORBA CORBA должны вести себя как одиночные, если вы передаете один и тот же параметр «ORB id» при инициализации их с помощью ORB_init(), Однако вы, вероятно, передаете один и тот же параметр каждый раз, что означает, что ORB предполагает, что вы хотите, чтобы все эти потоки совместно использовали один и тот же базовый экземпляр ORB.

Поэтому первое, что вам нужно сделать, это найти в документации ORBacus, как передавать уникальные идентификаторы ORB в каждом потоке. Возможно, используйте идентификатор потока в качестве дискриминанта.

Тем не менее, ваш подход может использовать улучшение. Создание ORB в каждом потоке — очень дорогая операция. Вместо этого создайте один общий ORB при запуске приложения и затем разрешите доступ к нему каждому потоку. Он должен быть уже защищен ORBacus от одновременного доступа. Убедитесь, что вы выполняете отключение / уничтожение ORB только в основной строке, а не в потоках.

1

Другие решения

Других решений пока нет …