2011-12-27 22 views
5

iyi:

veya
büyük alanda küçük kilitler için kilit açıklamada geniş kod alanı olması .. Bu örnekteki
borsaları değiştirilebilir değil mi? .kod alanları kilitlemek için doğru yolu nedir nedir

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

veya

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

Tam olarak ne için kilitlediğinize bağlıdır. – SLaks

+0

@SLaks, sanırım kilitlemeyi ne zaman kullanacağımı tam olarak anlayamıyorum .. :( – 0x49D1

+1

Örneğiniz tamamlanmadı, bu nedenle ne 'ex' ne de exchange'ler 'döngüde kullanılmadığı için soru kapsamında anlam ifade etmiyor. somut bir şey önermek zor – sll

cevap

1

Daha geniş kilitleme - çoklu iş parçacığından ne kadar az olursa olsun, tersi de Yani, kilitlerin kullanımı tamamen mantığa bağlıdır. Değişen tek şey ve yerleri Kilit ve koleksiyon sub kullanmak için kilit Bir süre

bir iş parçacığı tarafından sadece koşmak zorunda - küçük kilidi kullanın, ancak paralel

1

İyi uygulama o bölgede bütün sonra foreach döngüsü ise sadece belirli bir süre

anda sadece bir iş parçacığı tarafından yürütülecek istediğiniz bölgeyi kilitlemek olacaktır İlk yaklaşım,

fakat bu alan, gösterdiğiniz gibi sadece bir satırsa, ikinci yaklaşım için

1

birden eşzamanlı foreach döngüler içinde çalıştırırsanız Bu özel durumda, en iyi seçenek birincisidir, çünkü aksi halde sadece tüm zaman döngüsünü yürütmek zorunda olduğunuzdan beri zaman kilitleme/kilit açma israfını kaybedersiniz. Dolayısıyla, tek tek atomik işlemleri yürüten bir döngüde paralellik için çok fazla fırsat yok. "Doğru" Verilen Kod parçacıklarıyla olan Etkili hakim olamaz http://software.intel.com/en-us/articles/managing-lock-contention-large-and-small-critical-sections/

0

: kritik bölüm boyutlarıyla ilgili daha fazla genel tavsiyeler için

bu makaleye bakın. İlk örnek, kullanıcıların yalnızca içeriğin borsaların bir kısmı ile alt görebilmesinin tamam olmadığını söylüyor. İkinci örnekte, insanların alt bölümün yalnızca içeriğinin bir kısmının alt tarafını görmesi iyi bir şeydir.

1

İki farklı soru olduğunu düşünüyorum:
1. Hangisi doğru olurdu?
2. Hangisi daha iyi performans gösterir?

Doğrulık sorusu karmaşıktır. Veri yapılarınıza ve bunları korumak için kilidin nasıl tasarlandığına bağlıdır. Eğer "sub" nesnesi iplik güvenli değilse, büyük kilidi kesinlikle gerekir.

Performans sorusu daha basit ve daha az önemlidir (ancak bazı nedenlerle, daha fazla odaklandığınızı düşünüyorum).
Birçok küçük kilit daha yavaş olabilir, çünkü daha fazla iş yaparlar. Ancak, döngü kodunun büyük bir bölümünü kilit olmadan çalıştırmayı başarırsanız, biraz eşzamanlılık elde edersiniz, bu yüzden daha iyi olur.

+0

Güzel açıklama için teşekkür ederim. Tahsilat modifikasyonları içeren bazı kod parçalarıyla biten döngüler güvenli iplik koleksiyonları ile kilitler içine sokar. Burada benim için büyük kilit ifadesinde kötülük, bloğun aynı sınıftan olan ve aynı senkronizasyon nesnesini kullanan bazı yöntemler içermesiydi. Yani, bence, bazen çalışan programda deadlocks (ya da sadece gerekli kilitleri) yol açar :(Tüm modifikasyonlar programı şimdi daha duyarlı. – 0x49D1

İlgili konular