此问题与:Is it possible to have several ORB objects in the same process?
有关所以,感谢@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
是{{} 1}},第二个线程无法调用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 :(得分:0)
我找到了一种解决方法。使我的代码变得非常难看并且不容易获得支持,但它仍然是一些东西。
这就是我的所作所为:
ORB_init
中使用)ORB_init
,但它会通过几次次-ORBInitRef
参数,具有不同的值 - 每个线程/连接一个ORB_init
,而是直接执行resolve_initial_references
并继续执行特定于服务器的事务注意:我的示例不包含resolve_initial_references
,因为崩溃位于ORB_init
。
因此,对此“解决方法”应用此“算法”将如下所示:
#include <OB/CORBA.h>
void* run( void * );
CORBA::ORB_var varORB;
int main()
{
/** The necessary configurations */
//-------------------------------------v
const char* nameservice1 = "NameService1=corbaloc::10.102.8.15:13069/NameService";
const char* nameservice2 = "NameService2=corbaloc::192.168.1.99:13069/NameService";
//-------------------------------------^
/** INIT the ORB **/
int argc = 5; char* argv[ 6 ];
const char* initref = "-ORBInitRef";
const char* exe = "test";
argv[0] = (char*)exe;
argv[1] = (char*)initref; argv[2] = (char*)nameservice1;
argv[3] = (char*)initref; argv[4] = (char*)nameservice2;
argv[5] = NULL;
varORB = CORBA::ORB_init( argc, argv );
pthread_t t1, t2;
char ns_id1 = '1', ns_id2 = '2';
pthread_create( &t1, NULL, run, (void*)&ns_id1 );
pthread_create( &t2, NULL, run, (void*)&ns_id2 );
pthread_join( t1, NULL ); pthread_join( t2, NULL );
varORB->destroy();
return 0;
}
void* run( void* arg )
{
char nameservice[] = "NameServiceN";
// set the right number of the nameservice
nameservice[ 11 ] = *((char*)arg);
varORB->resolve_initial_references( nameservice );
// do some CORBA-specific stuff
printf( "SUCCESS %c\n", *(char*)arg );
return NULL;
}
我仍然无法相信这是唯一的选择。如果你仔细查看我的代码(在问题中),你会看到:
mt == false
的情况)ORB_init
IS 同步的呼叫mt == false
)所以,这不是我的问题的实际答案,这是一种解决方法。
在单个线程中创建多个ORB但在多个线程中不能创建多个ORB是没有意义的(至少对我而言)。
答案 1 :(得分:0)
ORB每次都会使用不同的连接(和线程)到不同的服务器 - 总是如此。接收答案和接听电话也在不同的线程中处理(如果有用和/或需要)。
我认为你试着尝试解决问题,ORB已经为你解决了。它是一个中间件,不要吓唬线程和东西。它已经由CORBA专家完成。