0

同時に多くのスレッドを実行している場合、1 つのスレッドだけがクリティカル リージョンに入るのを許可するにはどうすればよいですか? また、クリティカル領域に複数のスレッドがある場合はどうなりますか?

4

1 に答える 1

1

不適切に保護されたクリティカル セクションの結果として発生するバグにはいくつかの種類がありますが、最も一般的なのは競合状態と呼ばれるものです。これは、プログラムの動作または出力の正確さが特定の順序で発生するイベントに依存している場合に発生しますが、イベントが別の順序で発生する可能性があります。これにより、プログラムが予期しない、または予測できない方法で動作する傾向があります。(最後の点について少しあいまいで申し訳ありませんが、その性質上、正確な結果がどうなるかを事前に予測することは、「おそらくあなたが望んでいたものではないだろう」と言う以外には難しいことがよくあります)。

通常、これを修正するには、何らかのロックを使用して、一度に 1 つのスレッドのみがクリティカル セクションにアクセスできるようにします。これの最も一般的なメカニズムはミューテックス ロックです。これは「単純な」ケースに使用されます。ある種の共有リソースがあり、一度に 1 つのスレッドしかアクセスできません。

より複雑なケースでは、次のような他のメカニズムも利用できます。

  • リーダー/ライター ロック - 1 人のユーザーがリソースに書き込むか、無制限の数のユーザーがリソースから読み取ることができます。
  • セマフォのカウント - 指定された数のスレッドが特定のスレッドに一度にアクセスできます。例えとして、たとえば 100 台のスペースしかない駐車場を考えてみてください。100 台の車がそこに駐車されると、それ以上は受け入れられません (少なくとも、そのうちの 1 台が離れるまで)。
  • .NET Framework はManualResetEventを提供します。基本的に、問題のスレッドはイベントが発生するまで待機する必要があります。
  • これ自体はロックではありませんが、そもそもロックの必要性をなくすために、不変のデータ構造を使用することがますます一般的になりつつあります。ここでの考え方は、どのスレッドも別のスレッドのデータを変更できないということです。それらは常に、ローカル バージョンまたは変更されていない「中央」バージョンに対して動作します。
于 2016-10-20T15:26:19.343 に答える