gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:04:02 26 4
gpt4 key购买 nike

我使用 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 对象的引用计数指针)

  • 我添加了一个条件等待,所以线程只有在所有线程都执行完destroy时才开始调用ORB_init;围绕 ORB 创建了一个单例 包装器类,同步线程以一个接一个地连接,一切都开始正常工作。 但这意味着 - 只有一个 ORB,所以只有一台服务器。不好。

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

最佳答案

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

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

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

关于c++ - 是否可以在同一进程中拥有多个 ORB 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12933790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com