2012-11-01 29 views

cevap

138

ile

20

Sana System.Threading kitaplığında .NET kilitlemesi artış inşa kullanmanızı öneririz.

Aşağıdaki kod referans olarak uzun şekilde arttıracaktır ve tamamen güvenli iplik edilir:

Interlocked.Increment(ref myNum); 

Kaynak: http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx başkaları tarafından tavsiye edilen şekilde

66

, Interlocked.Incrementlock() daha iyi performans olacaktır. Sadece bir "bus lock" deyimine dönüştüğünü ve değişkenin doğrudan (x86) veya (x64) 'e eklendiğini (= x64) değiştirdiğini göreceğiniz IL ve Assembly'e bir göz atın.

Bu "veri yolu kilidi" deyimi, çağrı yapan CPU çalışırken, başka bir CPU'nun veri yoluna erişmesini engellemek için veri yolunu kilitler. Şimdi, C# lock() ifadesinin IL'sine bir göz atın. Burada bir bölümü başlatmak veya bitirmek için Monitor numaralı telefonu göreceksiniz.

Başka bir deyişle, .Net lock() ifadesi .Net Interlocked.Increment'dan daha fazlasını yapıyor.

SO, yapmak istediğiniz tek şey bir değişkeni arttırmaksa, Interlock.Increment daha hızlı olacaktır. Mevcut çeşitli atomik işlemleri görmek ve gereksinimlerinize uyanları bulmak için Tüm Kilitli yöntemleri gözden geçirin. Birden çok ilişkili ilişkili artışlar/azaltmalar gibi karmaşık şeyler yapmak veya tamsayılardan daha karmaşık olan kaynaklara erişimi serileştirmek için lock() kullanın.

+0

Uygulama ayrıntıları için bağlama – fsimonazzi

+0

-1 eklemeye devam edin. Kilitlemenin bir atomik işlemden çok daha yavaş olduğu doğrudur, ancak bunun IL ile hiçbir ilgisi yoktur. Bu işlev çağrıları, IL'lerin doğası gereği olmayan semantikleri için olmasa bile, bir atomik işlemden çok daha hızlı olacaktır. – Puppy