是否可以在同一个进程中拥有多个ORB对象?

时间:2012-10-17 11:57:09

标签: c++ multithreading corba orbacus

我使用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周围创建了一个 singleton 包装类,同步一个接一个地连接线程,一切都开始正常工作。 但这意味着 - 只有一个ORB,所以只有一个服务器。不好。

所以,所有这些事情都让我感觉很好,我允许每个进程只有一个ORB对象。我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

默认情况下,如果在使用ORB_init()初始化它们时传递相同的“ORB id”参数,则CORBA ORB应该像单例一样运行。但是,您可能每次都传递相同的参数,这意味着ORB假定您希望所有这些线程共享相同的底层ORB实例。

因此,您需要做的第一件事是在ORBacus的文档中找到如何在每个线程中传递唯一的ORB ID。也许使用线程ID作为判别式。

那就是说,你的方法可以使用改进。在每个线程中创建ORB是一项非常昂贵的操作。相反,在应用程序启动时创建一个共享ORB,然后允许每个线程访问它。应该已经受到ORBacus的并发访问保护。确保你也只在主线中进行ORB关闭/销毁,而不是在线程中。