1

我使用ORBacus。我有一个多线程应用程序,我想在同一个进程中有多个 ORB 对象。这个想法是:每个线程都有自己的 ORB 并连接到不同的服务器

这甚至可能吗?如果是这样 - 如何?


你试过什么? ”:我有

CORBA::ORB_var m_varOrb;

在每个线程中。每个线程调用。每个线程都有Reconnect方法,该方法执行:

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

这些问题,我有:

  • 当多个线程同时尝试重新连接时,应用程序在m_varOrb->destroy();或 中崩溃CORBA::ORB_init

  • 我尝试同步线程,以便所有线程尝试一一重新连接到配置的服务器(使用 a static mutex)-仍然无法正常工作-当一个线程尝试销毁“其” ORB对象时-再次崩溃destroy(某些断言失败,因为某些引用计数 > 1;看起来像是指向真实 ORB 对象的引用计数指针)

  • 我添加了一个条件等待,所以线程ORB_init只有在所有线程都执行后才开始调用destroy;在 ORB 周围制作了一个单例包装类,同步线程以一个接一个地连接,一切都开始工作得很好。但这意味着 - 只有一个 ORB,所以只有一个服务器。坏的。

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

4

1 回答 1

1

默认情况下,如果您在使用ORB_init(). 但是,您可能每次都传递相同的参数,这意味着 ORB 假定您希望所有这些线程共享相同的底层 ORB 实例。

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

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

于 2012-10-17T19:26:57.807 回答