SORU
13 AĞUSTOS 2008, ÇARŞAMBA


C değişkeni erişme# atomik işlem?

Ben büyüttüm inanıyorum ki eğer birden çok iş parçacığı erişim bir değişken, daha sonra tüm okur ve yazar için bu değişken korunmalıdır eşitleme kodu gibi bir "kilit" deyimi, çünkü işlemci olabilir geçiş yapmak için başka bir iş parçacığı yarısında yazın.

Ancak, Sistem bakıyordum.Web.Güvenlik.Üyelik Reflektör kullanarak ve bu gibi bir kod buldu

public static class Membership
{
    private static bool s_Initialized = false;
    private static object s_lock = new object();
    private static MembershipProvider s_Provider;

    public static MembershipProvider Provider
    {
        get
        {
            Initialize();
            return s_Provider;
        }
    }

    private static void Initialize()
    {
        if (s_Initialized)
            return;

        lock(s_lock)
        {
            if (s_Initialized)
                return;

            // Perform initialization...
            s_Initialized = true;
        }
    }
}

Neden s_İnitialized alan kilit dışında okumak mı? Başka bir iş parçacığı aynı anda yazmaya çalışıyor olamaz mı?Ve değişkenleri atom okur?

CEVAP
13 AĞUSTOS 2008, ÇARŞAMBA


Kesin cevap spec gitmek için. :)

Bölüm I, Bölüm 12.6.6 bu CLİ spec belirtir: "A uygun CLİ garanti eder, okuma ve yazma erişimi için düzgün hizalanmış bellek konumlarını hayır daha büyük yerli kelime boyutu atomik bütün yazma erişimleri için bir yer aynı boyutta."

Bu s_İnitialized asla kararsız geleceğini doğruladı, ve atomik primitve okuyup yazıyor.

Birbirine yeniden gelen işlemci önlemek için bellek okuma ve yazma bir bariyer oluşturur. Kilit bu örnekte sadece gerekli bariyer oluşturur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • celebrateubuntu

    celebrateubu

    23 Mayıs 2011
  • EEVblog2

    EEVblog2

    2 HAZİRAN 2014
  • Mr. H

    Mr. H

    1 Temmuz 2012