Этот вопрос связан с: Возможно ли иметь несколько объектов ORB в одном процессе?
Итак, благодаря @BrianKelly я нашел информацию об идентификаторе ORB
(хотя такой информации не было во всех ORBACUS
документах, которые у меня есть) и успешно создал простое приложение, которое подключается к разным CORBA
серверам и успешно выполнило несколько CORBA
запросов. .
Все идет нормально.
Теперь я хочу сделать это приложение многопоточным и запустить отдельный поток для подключения к разным серверам. Но ORB_init
вылетает.
Вот очень короткий код, который я использую для тестирования:
#include <OB/CORBA.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* run( void * );
struct config { const char* nameservice; const char* id; const char* exe; };
const bool mt = true;
int main()
{
config cfg1 = { "NameService=corbaloc::10.102.8.15:13069/NameService", "1", "test" };
config cfg2 = { "NameService=corbaloc::192.168.1.99:13069/NameService", "2", "test" };
if( mt )
{
pthread_t t1, t2;
pthread_create( &t1, NULL, run, (void*)&cfg1 );
pthread_create( &t2, NULL, run, (void*)&cfg2 );
pthread_join( t1, NULL ); pthread_join( t2, NULL );
}
else
{
run( (void*)&cfg1 );
run( (void*)&cfg2 );
}
printf( "SUCCESS!\n" );
return 0;
}
void* run( void* arg )
{
pthread_mutex_lock( &mutex );
int argc = 2; char* argv[3];
config* cfg = (config*)arg;
argv[0] = (char*)cfg->exe;
argv[1] = (char*)cfg->nameservice;
argv[2] = NULL;
CORBA::ORB_var m_varOrb = CORBA::ORB_init( argc, argv, cfg->id );
pthread_mutex_unlock( &mutex );
return NULL;
}
Итак, когда mt
равно false
, все в порядке, я могу расширить код для создания некоторых объектов, специфичных для сервера, для выполнения различных запросов и т. д. Но тогда mt
равно true
, второй поток не вызывает ORB_init
. См. трассировку стека ниже.
Я почти уверен, что упускаю что-то очень простое и глупое, но что?
$ g++ -g3 -ggdb -Wall -Wshadow -march=i486
-DUNIX -DLINUX -DPTHREADS -DMULTITHREAD -D_REENTRANT
-I. -I/usr/local/include/OB/ -I/usr/local/include/JTC/
-I/usr/include/OB/ -I/usr/include/JTC/ -L/usr/local/lib
-lpthread -lm -lz -lrt -ldl -lOB -lJTC -lCosNaming
test.cpp
Трассировки стека:
#0 0x00566402 in __kernel_vsyscall ()
#1 0x0080dfd0 in raise () from /lib/i686/nosegneg/libc.so.6
#2 0x0080f9b1 in abort () from /lib/i686/nosegneg/libc.so.6
#3 0x03dc490b in ~RefCount
(this=Could not find the frame base for "~RefCount".)
at ../../include/OB/RefCount_Ts_Linux-x86-32.h:43
#4 0x03ef8965 in ORBInstance
(this=Could not find the frame base for "ORBInstance".)
at ORBInstance.cpp:276
#5 0x03f134fe in ORB_impl
(this=Could not find the frame base for "ORB_impl".)
at ORB_impl.cpp:281
#6 0x03f24740 in OBCORBA::ORB_init
(ac=Could not find the frame base for
"OBCORBA::ORB_init(int&, char**, OB::Properties*,
OB::Logger*, OB::Reactor*,
char const*, char const*)". )
at ORB_init.cpp:994
#7 0x03f249d9 in CORBA::ORB_init
(ac=Could not find the frame base for
"CORBA::ORB_init(int&, char**, char const*, char const*)".)
at ORB_init.cpp:1014
#8 0x0804895d in run (arg=0xbfe8b544) at test_server.cpp:45
#9 0x007334d2 in start_thread () from /lib/i686/nosegneg/libpthread.so.0
#10 0x008b848e in clone () from /lib/i686/nosegneg/libc.so.6
ORB
являетсяshutdown
иdestroy
-ed, он не может быть создан другим потоком! Повторно инициализировать его может только первый поток, вызвавшийORB_init
в самом начале. Это просто смешно! Если я попытаюсь инициализировать его из другого потока (после того, как он был уничтожен), сбой будет таким же. Я действительно не могу поверить в это, черт возьми. 30.10.2012