.NETのマルチスレッドに関するいくつかの初心者の質問は、私が吸収しようとしているいくつかの概念を強化するのに役立つと思います-私はいくつかのマルチスレッド資料(Albahari電子ブックを含む)を読みましたが、いくつかの質問の確認が必要だと感じていますこれらの概念を家に持ち帰るのを助けるために
ロックスコープは、コードの共有領域を保護します-ループ内で単純な整数変数xをインクリメントするメソッドを実行するスレッドがあると仮定します-ただし、これは、別のスレッドの別のメソッドなど、変数xを変更する可能性のある他の場所のコードを保護しません..。。
これは、同じ変数に影響を与える可能性のある2つの異なるコード領域であるため、変数xの周りの両方のロックスコープに同じロック変数を使用してコードの両方の領域をロックすることでこれを解決しますか?コードの両方の領域を異なるロック変数でロックした場合、これは変数を正しく保護しませんか?
この例をさらに進めるために、同じロック変数を使用して、何らかの理由で、あるメソッドのコードが無限ループに入り、ロック変数を放棄しなかった場合はどうなりますか?他のメソッドのコードの2番目の領域はこれをどのように検出できますか?
ロック変数の選択は、ロックの動作にどのように影響しますか?私はすでにこのテーマに関する多数の投稿を読んだことがありますが、決定的な答えを見つけることはできません-場合によっては、この目的のためにオブジェクト変数を明示的に使用する場合もあれば、lock(this)を使用する場合もあります。人々が型オブジェクトを使用するのを見てきました。
ロック変数のさまざまな選択は、ロックの動作/範囲にどのように影響し、どのシナリオを使用するのが理にかなっていますか?
- add、remove、get、およびある種のCalculateメソッド(各オブジェクトが数量を表し、このメソッドが各値を合計するなど)を公開するクラスにラップされたハッシュテーブルがあり、これらのメソッドがすべてロックされているとします。ただし、オブジェクトへの参照が1回行われるとそのコレクションが他のコードで利用可能になり、アプリケーションに渡されると、このオブジェクト(ハッシュテーブルではない)は、そのクラスのメソッドを囲むロックスコープの外になります。次に、取得した実際のオブジェクトへのアクセス/更新を保護するにはどうすればよいですか。ハッシュテーブルから、Calculateメソッドに干渉する可能性がありますか?
これらの概念を強化するのに役立つヒューリスティックが提供されていることに感謝します-ありがとう!