SORU
30 EYLÜL 2008, Salı


Uçucu Kilitli vs vs kilit

Hadi bir sınıf birden çok iş parçacığı tarafından erişilen public int counter bir alan olduğunu söylüyorlar. int Bu sadece artan veya azalır.

Kullanılması gereken bu alanı artırmak için, ve neden?

  • lock(this.locker) this.counter ;,
  • Interlocked.Increment(ref this.counter);,
  • public volatile counter erişim değiştiricisi değiştirin.

volatile keşfettim şimdi lock birçok tablolar ve Interlocked kullanımı saklıyordum. Ama bunu yapmak için bir neden olabilir mi?

CEVAP
30 EYLÜL 2008, Salı


En kötü (aslında işe yaramaz)

public volatile counter erişim değiştiricisi değiştirin

Diğer insanlar da belirttiğim gibi, bu konuda kendi aslında hiçte güvenli değil. volatile noktası birden çok iş parçacığı çoklu İŞLEMCİ olabilir ve önbellek veri ve yeniden sipariş üzerine çalışan talimatları.

Eğer o isedeğilvolatile ve BİR CPU bir değer artırır, sonra CPU B aslında bir süre sonrasına kadar değeri artan bu sorunlara neden olabilir.

Eğer sadece 2 CPU sağlar bu volatile, eğer aynı anda aynı veri. Onları kendi okur araya girme ve önlemek için çalışıyoruz sorunu olan yazma işlemleri durdurmak değil.

İkinci En İyi:

lock(this.locker) this.counter  ;

Bu güvenli yapmak için (lock bunu her yerde this.counter erişim için hatırlıyorum sağlanır). locker tarafından korunan başka herhangi bir kod yürütmeden başka bir iş parçacığı engeller. Kilitler kullanarak harika olan da, yukarıdaki gibi multi-cpu, Yeniden Sipariş sorunları önler.

Sorun, kilitleme yavaş ve yeniden kullanın başka bir yerde locker hangi gerçekten söz konusu ise sebepsiz yere diğer konuları engelleme sona erebilir.

İyi

Interlocked.Increment(ref this.counter);

Bu güvenli, etkili okuma, artış yaptığı gibi, 'yazmak bir hit kesintiye olamaz'. Bu nedenle başka bir kod etkilemeyecek ve başka bir yerde ya da kilitlemeyi unutma gerek yok. Ayrıca çok hızlı (MSDN dediği gibi, modern işlemcilerde bu genellikle kelimenin tam anlamıyla tek bir CPU talimat).

Tamamen ancak diğer CPU Yeniden Sipariş şeyler olursa, ya da artış ile uçucu birleştirmek gerekirse emin değilim.

Aslında Ne için iyidir. Dipnot:

volatile çoklu sorunları bu tür önlemek değil de nedir? İyi bir örnek 2 konuları, her zaman bir değişkene yazıyor hangisi (queueLength say), ve her zaman aynı değişken okur hangisi olduğunu varsayalım.

Eğer queueLength geçici ise, Bir iş parçacığı 5 kez yazabilirsiniz, ancak iş parçacığı B gecikmeli olarak yazar (hatta yanlış sırada potansiyel olarak) görebilirsiniz.

Bir çözümü olabilir, ama aynı zamanda bu durumda uçucu kullanabilirsiniz. Bu iş parçacığı, B parçacığı her zaman en yazılı olan güncel bir şey göreceksiniz emin olun. Ancak bu mantık unutmayınsadeceeğer varsa çalışır hiç okuyan yazarlar ve asla yazma okuyucular,veyazıyorsanız şey atomik bir değer. -Değiştirme-okuma ve yazma bir tek sen söyler söylemez, Kilitli işlemleri için gitmek ya da bir Kilit kullanmanız gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3dmmfavs

    3dmmfavs

    29 Kasım 2009
  • MrRandomSong

    MrRandomSong

    29 Kasım 2009
  • TeeMayneTV

    TeeMayneTV

    27 Kasım 2010