C#4アプリケーションでは、Webリクエストを並列処理するタスク並列ライブラリを使用します.Webレスポンスを取得した後、グローバル変数を更新する必要があります。ロックを追加することにしましたその変数を更新するブロック。相互排除を取得するには、lockステートメントが最適なオプションですか? TPLのロックステートメントの数(またはロックブロックのサイズ)とTPLのパフォーマンス低下の正確な関係は何ですか?タスク並列ライブラリのロックステートメントとパフォーマンス
答えて
最初の質問に対する答えは「はい」です。そして、いいえ。 lock
ブロックを使用するか、Mutex
を使用することができますが、実際の違いはほとんどありません(単一のアプリケーションのコンテキスト内)。
2番目の質問に対する答えは、正確な関係はありません。あなたは万ロックを持つことができますが、お互いをブロックしている場合にのみパフォーマンスが低下し、ブロックする量に応じて減少します。 (警告:それ自体でロックするとパフォーマンスが低下します)
コードの正確なプロファイルによって、関係が何であるかが決まります。これは、いくつかのテストを実行して見つけ出すことによってのみ実際に認識されます。
最初のステートメントについて:実際には 'lock'はより軽量ですが、' Mutex'はオペレーティングシステムオブジェクトであり、常にカーネルからハンドルを割り当てる必要があります。 'lock'または' Monitor'は、実際にブロックしたり満足しているとき、つまり短いスピン時間の後にロックを取得しないときにのみ、カーネルプリミティブ(シーンの裏側)を使用します。したがって、一般的に、複数のプロセスにまたがるロックを必要としない限り、ロックを使用するほうが優れています。 –
1つの変数を更新していて(原子単位として複数の変数を更新する必要はありません)、私はロックレスの原子的機能を提供するInterlockedクラスを使用します。これらの変数を更新しようとするスレッドが多数ある場合、Interlockedは競合を減らすのに役立ちます。
http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx
いくつかのコード例を掲載すると、これに対する回答が得られます。 –