2011-12-27 5 views
5

よりよい:

または
は、大面積の小さなロックを持っているロック文で大コード領域を持っている...このサンプルで
交換はchangableではありません? 。は、コード領域をロックする適切な方法は何である何

lock (padLock) 
{ 
    foreach (string ex in exchanges) 
    { 
    sub.Add(x.ID, new Subscription(ch, queue.QueueName, true)); 
......... 
} 

または

foreach (string ex in exchanges) 
{ 
    lock (padLock) 
    { 
    sub.Add(x.ID, new Subscription(ch, queue.QueueName, true)); 
    } 
..... 
+2

あなたがロックしているものに完全に依存します。 – SLaks

+0

@SLaks、私は完全に理解していないと思うロックを使用して.. :( – 0x49D1

+1

あなたの例が完了していないので、 'ex'も 'exchanges'もループで使用されていないので質問の範囲では意味がありませんあなたが何か具体的に何かを提案するのは難しい – sll

答えて

1

より広いロック - より多くのあなたはマルチスレッドから得て、逆もそうです。 したがって、ロックの使用は完全にロジックに依存します。変更物事や場所のみをロックして、コレクションsubを使用するためにロックした場合の時間

に一つのスレッドでのみ実行する必要があります - 小さなロックを使用しますが、では、並列

1

グッドプラクティスは、その領域全体foreachループが続いている場合にのみ、あなたが与えられた時間

での1つのスレッドだけで実行させたいその領域をロックするだろう最初のアプローチはきれいです

しかし、あなたが示しているようにその領域が1行であれば、2番目のアプローチに進みます。

1

で複数の同時foreachループを実行する場合とにかくループ全体を実行しなければならないので、この特別な場合は、最善のオプションが最初のものです。とにかく個別のアトミック操作を実行するループでは、並列処理の機会はあまりありません。 「右」は、与えられたコードスニペットであるあなたが効果的に判断できないhttp://software.intel.com/en-us/articles/managing-lock-contention-large-and-small-critical-sections/

0

:クリティカルセクションのサイズに関する一般的なアドバイスについて

は、この記事をご確認ください。最初の例では、人々は交換のコンテンツの一部だけでサブを見ることはOKではないと言います。 2番目の例では、人々は交換のコンテンツの一部のみを使ってサブを見ても問題ないと言います。

1

私は2つの異なる質問があると思います:
1.どちらが正しいでしょうか?
2.どちらの方がパフォーマンスが向上しますか?

正確性の問題は複雑です。それはあなたのデータ構造と、それらを保護するためのロックの仕方によって異なります。 "サブ"オブジェクトがスレッドセーフでない場合は、必ず大きなロックが必要です。

パフォーマンスの問題は単純で重要ではありません(何らかの理由で、もっと重視していると思います)。
小さなロックの多くは、もっと多くの作業を行うだけで、処理速度が遅くなることがあります。しかし、ロックなしでループコードの大部分を実行すると、いくらかの同時実行性が得られるため、より良い結果が得られます。

+0

素敵な説明に感謝します。私はスレッドの安全なコレクションではないループを、コレクションの変更を含むいくつかのコードを使ってロックするようにしました。ここで大きなロックステートメントの悪い点は、ブロックにも同じクラスのメソッドが含まれていて、同じ同期オブジェクトが使用されていることでした。だから、ときどき実行中のプログラムでデッドロック(または単にロックが不要)になることがあると思います。 – 0x49D1

関連する問題