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
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.
Codeıgniter - $config değişkeni erişme...
Nasıl raylar (temelde en iyi yol ne) b...
Nasıl node.js çevre değişkeni ayarlaya...
İşlem çubuğu navigasyon modu Android L...
Sabitleme "dur zaman aşımı aşıldı...