0

アンマネージ MTA COM オブジェクトに関連するバグに取り組んでいます。オブジェクトには Lock メソッドと Unlock メソッドがあり、Unlock を呼び出すために Lock を呼び出したのと同じスレッドを必要とするミューテックスを使用します。

問題は、Lock と Unlock がマネージ STA スレッドから (COM 相互運用機能を使用して) 呼び出される場合、呼び出しは RPC コールバック スレッドの COM オブジェクトに入りますが、使用されるコールバック スレッドは両方の呼び出しで常に同じであるとは限りません。同じでない場合、ミューテックスのロックを解除できないため、Unlock 呼び出しは失敗します。

言い換えると:

マネージド STA スレッド 1 -> RPC コールバック (スレッド 11) -> ロック

マネージド STA スレッド 1 -> RPC コールバック (スレッド 12) -> ロック解除 -> エラー

修正について決定を下す前に、考えられるすべての解決策を評価しようとしています。そのため、私は見つけようとしています:

1) そもそも RPC コールバック スレッドが使用されないようにする方法はありますか? 私のテストでは、管理されていない STA スレッドからオブジェクトへの呼び出しを行うと、呼び出しは呼び出し元のスレッド自体に着信するように見えます。RPC コールバック スレッドの使用を必要とする .Net からの呼び出しとの違いは何ですか? RPC コールバックが使用されないようにする方法はありますか? (MTA 呼び出しスレッドを使用する場合を除く)

2) そうでない場合、同じマネージド STA スレッドから一貫した RPC コールバック スレッドを強制的に使用する方法はありますか?

4

1 に答える 1

1

これは、フリー スレッド サーバーの仕様です。COM はあなたの言葉を信じて、スタブが任意の RPC スレッドを使用できるようにします。スレッド ID について推測することはできません。RPC スレッドはプールから選択され、リサイクルされます。残念ながら、呼び出しが順番に行われるときに同じものを選択することが多いため、最初は正常に機能しているように見えます。しかし、複数の同時サーバー呼び出しが行われるとすぐに問題が発生します。それを選択的にするオプションはありません。フリースレッドサーバーは気にしないことを約束します。それは実際にはうまく機能せず、恐ろしくスケーリングするか、デッドロックを引き起こします。

したがって、ミューテックスを使用してロックを実装することはできません。スレッド アフィニティがあります。セマフォは良い選択です。

于 2013-07-15T16:27:10.347 に答える