1

ORBacusを使用しています。マルチスレッド アプリケーションを使用しており、複数の ORB オブジェクトを同じプロセスに配置したいと考えています。アイデアは、各スレッドが独自の ORB を持ち、異なるサーバーに接続されることです。

これは可能ですか?もしそうなら - どのように?


"何を試しましたか? " : 試しました

CORBA::ORB_var m_varOrb;

各スレッドで。各スレッドが呼び出します。各スレッドにはReconnectメソッドがあり、次を実行します。

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

問題、私は持っています:

  • 複数のスレッドが同時に再接続しようとすると、アプリケーションがm_varOrb->destroy();または でクラッシュしCORBA::ORB_initます。

  • スレッドの同期を試みたので、すべてのスレッドが構成済みのサーバーに 1 つずつ ( を使用してstatic mutex) 再接続しようとしましたが、まだ機能していません。1 つのスレッドが「その」ORB オブジェクトを破棄しようとすると、再びクラッシュしdestroyます (いくつかのアサートが失敗し、一部の参照カウントが > 1 であるため、実際の ORB オブジェクトへの参照カウント ポインターのように見えます)

  • 条件付き待機を追加したので、スレッドORB_initはすべてのスレッドが実行されたときにのみ呼び出しを開始しdestroyます。ORBの周りにシングルトンラッパークラスを作成し、スレッドを同期して次々に接続すると、すべてが完全に正常に機能し始めました。しかし、これは、ORB が 1 つしかないため、サーバーが 1 つだけであることを意味します。悪い。

したがって、これらすべてのことから、プロセスごとに 1 つの ORB オブジェクトしか持てないことがわかりました。何か不足していますか?

4

1 に答える 1

1

デフォルトでは、CORBA ORBを初期化するときに同じ「ORBid」パラメーターを渡すと、CORBAORBはシングルトンのように動作するはずですORB_init()。ただし、おそらく毎回同じパラメーターを渡しているため、ORBは、これらすべてのスレッドが同じ基になるORBインスタンスを共有することを想定していることを意味します。

したがって、最初に行う必要があるのは、ORBacusのドキュメントで、各スレッド内で一意のORBIDを渡す方法を見つけることです。おそらく、判別式としてスレッドIDを使用します。

そうは言っても、あなたのアプローチは改善を使用することができます。各スレッドでORBを作成することは、非常にコストのかかる操作です。代わりに、アプリケーションの開始時に1つの共有ORBを作成し、各スレッドがそれにアクセスできるようにします。同時アクセスからORBacusによってすでに保護されている必要があります。スレッドではなく、メインラインでもORBのシャットダウン/破棄のみを実行するようにしてください。

于 2012-10-17T19:26:57.807 に答える