0

ちょっとした紹介:

複雑なマルチスレッド アプリケーション (エンタープライズ サービス バス ESB) では、Thread.Abort を使用する必要があります。この ESB は、ハードウェア セキュリティ モジュールと通信するユーザー作成モジュールを受け入れるためです。したがって、このモジュールがデッドロックしたり、ハードウェアが応答しなくなったりした場合は、このモジュールをアンロードするだけで済み、残りのサーバー アプリケーションは実行し続ける必要があります。

そのため、ユーザー セクションでのみコードを中止できることを保証する中止同期メカニズムがあり、このセクションは AbortAble としてマークする必要があります。これが発生した場合 (中止)、次のコードで ThreadAbortException がスローされる可能性があります。


public void StopAbortSection()
        {
            var id = Thread.CurrentThread.ManagedThreadId;
            lock (threadIdMap[id])
            {
                ....
            }
        }

たとえば、モジュールは AbortSection にあり (同様のメソッド StartAbortSection を呼び出すことによって入力されます)、ServerAplication はユーザー モジュールを中止することを決定しますが、この決定の後、実際の Thread.Abort の前に、モジュールはこのメソッドを呼び出すことによって NonAbortableSection に入りますが、実際にはそのロック オブジェクトでロックが取得されます。 .

したがって、ロックは中止が実行されるまでブロックされますが、このコードでこのブロックに到達する前に中止を実行することもできます。しかし、このメソッドを持つオブジェクトは不可欠であり、このコードの断片がいつでも中止しても安全であることを確認する必要があります (破損しない - たとえば、辞書から読み取るときに何が起こるかわかりません..)。

したがって、threadIdMap は Dictionary(int,ManualResetEvent) であり、ロック オブジェクトは ManualResetEvent のインスタンスであることに言及する必要があります。

私の質問を理解していただければ幸いです。大きくてすみません。

4

1 に答える 1

1

例外が「違反している」とはどういう意味ですか?

ThreadAbortException は、コード内のどこでもスローできます。あるスレッドが別のスレッドを中止している場合、スレッドを中止するコードがロック内にあり、スレッドが同じオブジェクトをロックしていない限り、ロックはまったく影響しません。

スレッドが有効になるには、同じオブジェクトをロックする必要があります。ディクショナリに同じ ManualResetEvent オブジェクトへの参照を含む別の項目がない限り、ロックはまったく役に立ちません。

于 2010-04-15T15:05:22.720 に答える