SORU
27 Aralık 2009, Pazar


Çift uçucu değiştirici ihtiyacı kilitleme kontrol etti .NET

Birden çok metin-kontrol çift kilitleme uygularken söylüyorlar .NET kilitleme alan uçucu değiştirici uygulanmalıdır. Ama tam olarak neden? Aşağıdaki örneği dikkate alarak:

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}

neden "(syncRoot)" başarmak gerekli bellek tutarlılık? kilitlenmiyor Doğru olan "" ifadesi, hem okuma hem de geçici olur ve gerekli tutarlılık başarılı olur yaz? kilit değil

CEVAP
27 Aralık 2009, Pazar


Uçucu gereksiz. Peki,** tür

volatile bariyer* arasında ve değişken okur yazar bir bellek oluşturmak için kullanılır.
Kullanıldığında lock bellek engelleri bir konuya engellemek için erişimi sınırlamak için ek olarak lock, iç blok etrafında oluşturulan neden olur.
Bellek engelleri her iş parçacığı değişken (yerel bir değer bazı kayıt önbelleğe değil) en güncel değeri okur ve derleyici tabloları yeniden düzenlemek değil. Zaten bir kilit var çünkü volatile** gereksiz.

Joseph Albahari benim yapabileceğimden çok daha iyi bunları açıklar.

Ve C Skeet guide to implementing the singleton Jon kontrol etmek emin olun


güncelleme:
6* **neden CLR x 86 ve x 64, MemoryBarrier ile uygulanan VolatileWrites VolatileReads ve yazar olmak değişken okur. Diğer sistemlerde daha ince taneli olabilir.

**benim cevabım ise 86 ve x 64 işlemciler üzerinde CLR kullanıyorsanız sadece doğru.olabilirdiğer bellek modelleri, Mono (ve diğer uygulamalar), İtanium64 ve gelecekteki donanım gibi gerçek olacak. Bu Jon "" çift kontrol kilitleme için. frikiklerinden bu yazısında atıfta ne olduğunu

{İşaretleme değişken olarak . biri yapıyor ^code>uçucu, okumaİplik.VolatileReadya bir ara eklemeİplik.MemoryBarrier} kodu düzgün zayıf hafıza modeli bir durumda çalışmak için gerekli olabilir.

Anladığım kadarıyla, CLR (hatta IA64) yazar asla yeniden (yazar hep semantik release). Ancak, İA64, uçucu işaretlenmiş sürece yazar önce gelmek düzenlenmesine okur. Unfortuantely, ben bu konuda bir şey söylemek spekülasyon olur ile oynamak için İA64 donanım erişimi yok.

ayrıca bu makale yararlı bulduk:
http://www.codeproject.com/KB/tips/MemoryBarrier.aspx
13* *(Her şey bu bağlantılar, çift kilitleme kontrol konuşur)
14* *(Her şey bu bağlantılar)
Joe Duffy: Broken Variants of Double Checked Locking

çoklu üzerinde luis abreu serisi çok kavramlarını güzel bir bakış ver
http://msmvps.com/blogs/luisabreu/archive/2009/06/29/multithreading-load-and-store-reordering.aspx
http://msmvps.com/blogs/luisabreu/archive/2009/07/03/multithreading-introducing-memory-fences.aspx

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • talkandroid

    talkandroid

    27 Mayıs 2010
  • TechRax

    TechRax

    21 EYLÜL 2009
  • TheScorpioTechno

    TheScorpioTe

    15 Aralık 2010