1

マルチスレッドについて概念的な質問があります。

マルチスレッドアパートメント構成で、DCOMを介してRPCを使用するアプリケーションでは、メインフォームはフリーズです。

1-ユニットの初期化でCriticalSessionが作成された場合、Critical Sessionのコードはメインスレッドコンテキストで実行されますか?

2-メソッドを呼び出してタスクを実行すると、
スレッド1が作成されます。(DCOMスレッド)
スレッド1はスレッド2を作成します。スレッド1はスレッド2を
待機します。
スレッド2は4つのスレッドを作成して、タスクをより高速に実行します。
スレッド2ループは、4つのスレッドが終了するまで2秒間スリープします。このプロセスでは、メインフォームが更新されて完了率が表示されることになっています。パーセントが完了したメッセージがメインフォームスレッドに投稿されますが、何も起こらず、メインフォームはフリーズします。

3-スレッド2でオブジェクトをCRUD(Create Read Update Delete)する必要があるときに、4つのスレッドの1つで同期するために、synchronized()メソッドの代わりにもっと良い方法がありますか?

4- 4つのスレッドの優先度がメインスレッドよりも高いのはこれが問題ですか?これが問題になるのはいつですか?

以下の画像は、システムのアーキテクチャを表しています。

システムアーキテクチャー

4

1 に答える 1

4

1:いいえ。重要なセクションを使用することで、コードが一度に1つのスレッドでのみ実行されることを保証します。実際には、Enterを呼び出すスレッドは、そのコードを実行している他のスレッドがLeave呼び出しに到達するまでそこにハングします。ただし、これはメインスレッドで実行されるという意味ではありません(GetCurrentThreadIDで確認してください)

2:アパートの構成について言及しましたが、どのアパートのスレッドモデルですか?これは、(D)COMがいつスレッド同期を行うかを定義します。実際には、COMはプロキシスタブとマーシャリングを使用して、アパート(およびネットワーク)の境界を通過します。ただし、マルチスレッドのアパートを選択した場合は、COMがコンポーネント自体でスレッドの問題を処理すると想定します。

私が正しく理解していれば、メインフォームは「スレッド1WaitForThread2」でフリーズします。WaitForを呼び出す代わりに、Thread2でOnTerminateイベントを使用する方がよいでしょう。

3:「スレッド2のCRUDオブジェクト」の意味がわかりません。4つのスレッドがどの順序で終了するかを知ることが重要でない場合は、スレッドで順番にWaitForを呼び出すことをお勧めします。そうである場合は、 WaitForMultipleObjectsをチェックアウトする必要があります。

4:異なる優先順位は問題ではありません。あまりにも多くの作業を行っている優先度の高いスレッドが多すぎて、内部通信を行っている通常の優先度のスレッドが追いつかない場合にのみ問題になる可能性がありますが、その場合は、ワーカースレッドが作業を報告する方法を確認する必要があります。

于 2013-03-11T15:40:12.587 に答える