同一进程中是不是可以有多个 ORB 对象?
Posted
技术标签:
【中文标题】同一进程中是不是可以有多个 ORB 对象?【英文标题】:Is it possible to have several ORB objects in the same process?同一进程中是否可以有多个 ORB 对象? 【发布时间】:2012-10-17 11:57:09 【问题描述】:我使用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 周围制作了一个 singleton 包装类,同步线程以一个接一个地连接,一切都开始正常工作。 但这意味着 - 只有一个 ORB,所以只有一个服务器。 不好。
所以,所有这些事情都让我觉得我被允许每个进程只有一个 ORB 对象。我错过了什么吗?
【问题讨论】:
【参考方案1】:默认情况下,如果您在使用ORB_init()
初始化它们时传递相同的“ORB id”参数,则 CORBA ORB 的行为应该像单例一样。但是,您可能每次都传递相同的参数,这意味着 ORB 假定您希望所有这些线程共享相同的底层 ORB 实例。
所以您需要做的第一件事是在 ORBacus 的文档中找到如何在每个线程中传递唯一的 ORB ID。或许使用线程 ID 作为判别式。
也就是说,您的方法可以改进。在每个线程中创建一个 ORB 是一项非常昂贵的操作。相反,在应用程序启动时创建一个共享 ORB,然后允许每个线程访问它。它应该已经受到 ORBacus 的保护以防止并发访问。确保您也只在主线中执行 ORB 关闭/销毁,而不是在线程中。
【讨论】:
如果我对您的理解正确,那么您错过了一些东西 - 我想让我的线程连接到不同的服务器。这是否可以通过创建单个 ORB 对象来实现? 同一个 ORB 可以连接到托管在不同服务器上的任意数量的不同 CORBA 对象。所以是的,你可以用一个 ORB 对象来做到这一点。 酷,它有效。如果其他人对此感兴趣 - 研究“多球应用程序/环境”和“球标识符”。谢谢!赞赏。 我有一个关于此的新问题:***.com/questions/13009694/… - 如果您有兴趣,请提前致谢!以上是关于同一进程中是不是可以有多个 ORB 对象?的主要内容,如果未能解决你的问题,请参考以下文章
在同一个 GPU 上运行多个 tensorflow 进程是不是不安全?
oracle中多个进程可以使用merge into语句对同一个表操作不,能锁表吗
从同一个 .exe 打开每个实例后,是不是可以重命名进程(而不是程序名称)?