1

C#4アプリケーションでは、タスク並列ライブラリを使用してWeb要求を並列処理します。Web応答を取得した後、いくつかのグローバル変数を更新する必要があるため、その変数を更新するためにロックブロックを追加することにしました。ロックステートメントは相互排除を取得するための最良のオプションですか?また、TPLのロックステートメントの数(またはロックブロックのサイズ)とTPLのパフォーマンスの低下との正確な関係は何ですか?

4

2 に答える 2

1

最初の質問に対する答えは次のとおりです。はい。そして、いいえ。lockブロックを使用することも、を使用することもできますがMutex、実際的な違いはほとんどありません(単一のアプリケーションのコンテキスト内で)。

2番目の質問に対する答えは次のとおりです。正確な関係はありません。100万のロックを持つことができますが、パフォーマンスは、それらが互いにブロックしている場合にのみ低下し、ブロックの量に応じて低下します。(警告:それ自体をロックする行為は、パフォーマンスの低下を招きます。)

コードの正確なプロファイルによって、関係が何であるかが決まります。これは、いくつかのテストを実行して調べることによってのみ実際にわかります。

于 2012-04-23T16:17:47.160 に答える
1

単一の変数を更新する場合(およびアトミックユニットとして複数の変数を一緒に更新する必要がない場合)、ロックレスアトミック機能を提供するInterlockedクラスを使用します。多くのスレッドがすべてこれらの変数を更新しようとしている場合、Interlockedは競合を減らすのに役立ちます。

http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx

于 2012-04-23T16:27:24.587 に答える