2009-05-14 15 views
3

COMサービス内でインスタンス化されるCOMコンポーネントが1つあります(この.exeが実行されています)。スレッドはCOMコンポーネント内でどのように作成されますか?

私は10のクライアントを持っています。各クライアントは、ROTからIXyz(インタフェース)ポインタを取得し、同時にIXyz :: abc()メソッドを呼び出しています。

私のトレースから、IXyz :: abc()は同時に10回呼び出されるgetttingだが、10個の異なるスレッドであることがわかります。

これらの10のスレッドは誰が作成していますか?

答えて

0

COMサブシステムがこれを行います。これは、同時に呼び出される異なる呼び出しを処理するための別個のスレッドを作成します。コンポーネントがMTAの場合、リクエストは並行して実行されます.STAの場合、共有変数の破損を防ぐために一度に1つずつ実行されます。

2

COMの動作は、それについて考えると意味があります。コードはサービスプロセス内で実行されます。このクラスをSingle Threaded Apartmentで実行するようにマークすると、一度に1つのスレッドしか実行されません。並行コールは、一度に1つずつ実行されるメッセージqeueuにスタックされます。マルチスレッドアパートメントが指定されている場合、コードは同時に実行できます。実行中のプロセスでこれを達成するために、複数のスレッドがこの動作を達成するようにスピンアップされます。

並行処理の問題を避けたい場合は、クラスをdllに入れる必要があります。それでも複数のスレッドがありますが、それぞれが呼び出しプロセスで実行されるので、状態について心配する必要はありません。

スレッドなしで任意のブロックのコードを同時に実行する方法はありません。別々のプロセスで実行しても、まだ複数のスレッドが関与していますが、それらはプロセス境界によって分離されています。

私はかつて彼女の頭を通ってこれを得ることができなかった会社のために働いたobviouse becayseに腹を立てています。 :-)彼らは、別々のプロセスで実行し、共有メモリ(メモリマップされたファイル)を使用してスレッドの問題を回避できると考えました。これは、コードが1つのCPU上で実行され、矛盾を修正するための「修復」アプリケーションを追加したときに機能しました。最後のインストールでは、複数のCPUに移行し、すべてが本当に分断されました。それから、私は終わりを去った。

関連する問題