15

これらは実際には 3 つの異なる概念ですか、それともごちゃごちゃしていますか? (スレッド化とガベージ コレクションに関する記事を一緒に読んでいて、混乱してしまいました。)

「クリティカル セクション」 - これは、複数のスレッドが同時にアクセスすることを望まないコードのセクション、つまり lock および Monitor.Enter/Exit ステートメント内の用語であると思いますか?

「クリティカル リージョン」 - ここには本当の手がかりはありません - MSDN は、「これは、セクション内でスローされた例外がより広い影響を与える可能性があることをホストに伝えます」という行に沿って何かを言います。そして、「Sql Server などの CLR のホスト」は、重要な領域内でスローされた例外を「異なる方法で」処理することを選択する場合があります。別の方法?なぜ?そして、最も重要なこととして、コードをクリティカル リージョンとしてマークする必要があるのは、実際にはどのようなシナリオでしょうか?

「制約付き実行領域」 - ガベージ コレクションの記事で CriticalFinalizerObject について読んでいるときに、これに出会いました。

これについて MSDN から理解できるのは、これらのリージョンのいずれか内のコードは何らかの形で実行が保証されているため (しかし、どのように?)、「帯域外」の例外をスローしてはならないということだけです。

とは何out-of-band exceptionですか? (これをグーグルで検索しましたが、「範囲外の例外」を意味するかどうか尋ねられました)。

未処理の例外ですか?それとも特定の種類の例外のみですか? 繰り返しになりますが、最も重要なこととして、「制約付き実行領域」が必要になる現実世界のシナリオは何ですか?

概念がよくわからないので、「.NET」以外にこの質問に必要なタグがわかりません。

4

8 に答える 8

6

これらの概念についての私の理解:

クリティカルセクション- あなたが言ったように。

クリティカル領域- これは、「例外をスレッドから逃がさない」の全体像のようです。

制約付き実行領域- これは、例外による中断を防ぐことによって、コードの一部を多かれ少なかれアトミックにする方法です。このページの例では、これを使用して、ハンドルの割り当てと格納の両方が確実に実行されるようにしています。ロールバックはなく、より予防的なシステムであることに注意してください。

これに少し似た「通常のプログラミング」のガイドラインがあります。つまり、Equals または暗黙の演算子をオーバーライドする場合は、(何も) スローしてはなりません。

于 2009-04-14T13:58:27.570 に答える
3

Joe Duffy による Windows での同時プログラミングによると、クリティカル セクション/領域の定義は次のとおりです。

クリティカル セクション: Win32 では、クリティカル セクションは、CRITICAL_SECTIONクリティカル リージョンを構築するために使用される単純なデータ構造 ( ) です。

クリティカル領域: 相互排除を享受するコード領域です (これは、上記でクリティカル セクションと呼んでいるもののようです)。

于 2009-04-14T13:49:54.940 に答える
3

このブログ エントリは、あなたの混乱を埋めます。 リンク

于 2010-11-10T02:17:55.413 に答える
1

Critical Section A set of instructions, some of which access shared objects.

Ignore for the moment that both ProcessA and ProcessB can be executed concurrently. You would not want to depend on the value of x, if either ProcessA or ProcessB are to be executed concurrently by many different threads as it will most likely lead to a race condition.

In this example, the two while loops are Critical Sections.

int x = 0;
Process A() {
    while(true) {
        x++;
        x--;
    }
}
Process B() {
    while(true) {
        x++;
        x--;
    }
}

Critical Region A set of critical sections.

Now assume that you can execute ProcessA and ProcessB concurrently. Each process has a critical section. Both of the sections share the same variable (x). Together, the two critical sections form a critical region. Why is this important? If you assume that the critical section of ProcessA is guarded by mutual exclusion, you will still get incorrect results in x as ProcessB does not honour the mutual exclusion. You need to implement mutual exclusion on the critical region, by implementing it on every critical section which makes up the region.

于 2014-10-23T16:18:23.543 に答える
0

クリティカル セクション: コードの一部です。すべてのプロセスには、共通変数の交換、テーブルの更新、ファイルの書き込みなどを行うクリティカル セクションがあります。重要な機能は、1 つのプロセスがそのクリティカル セクションで実行されている場合、他のプロセスがそのクリティカル セクションに入ることができず、マニュアルを提供することです。除外。もちろん、それを実現するために、「セマフォ」と呼ばれる同期ツールが、arw 'n' 個のプロセスがある場合に使用されます。セマフォは整数変数です。

クリティカル領域: プログラマが作成する可能性のあるクリティカル セクションの問題に対するセマフォ ソリューションに関連する特定の単純なエラーを防ぐ同期構造です。

于 2014-03-17T17:59:44.727 に答える
0

別のプロセスが入る前に、それを開始する各プロセスによって終了する必要があるコードのセクションは、クリティカル領域と呼ばれます。

于 2009-05-25T08:48:05.037 に答える