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
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.
Kilitli ve uçucu...
Oluşturulamadı kilit dosyası aç/: /dat...
Kilit tam olarak nasıl çalışır?...
başvuru atama neden Kilitli yani atom....
Neden uçucu yararlı birden çok iş parç...