я использую 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 на процесс. Я что-то пропустил?
По умолчанию ORBA CORBA должны вести себя как одиночные, если вы передаете один и тот же параметр «ORB id» при инициализации их с помощью ORB_init()
, Однако вы, вероятно, передаете один и тот же параметр каждый раз, что означает, что ORB предполагает, что вы хотите, чтобы все эти потоки совместно использовали один и тот же базовый экземпляр ORB.
Поэтому первое, что вам нужно сделать, это найти в документации ORBacus, как передавать уникальные идентификаторы ORB в каждом потоке. Возможно, используйте идентификатор потока в качестве дискриминанта.
Тем не менее, ваш подход может использовать улучшение. Создание ORB в каждом потоке — очень дорогая операция. Вместо этого создайте один общий ORB при запуске приложения и затем разрешите доступ к нему каждому потоку. Он должен быть уже защищен ORBacus от одновременного доступа. Убедитесь, что вы выполняете отключение / уничтожение ORB только в основной строке, а не в потоках.
Других решений пока нет …