2012-12-03 21 views
6

C# Volatile anahtar kelimesinin gerçek zamanlı kullanımını görmek istiyorum. ancak en iyi örneği yansıtamıyorum. Aşağıdaki örnek kod Volatile anahtar sözcüğü olmadan çalışır nasıl mümkün olabilir?C# içinde geçici anahtar kelime amacı nedir?

class Program 
{ 
    private static int a = 0, b = 0; 

    static void Main(string[] args) 
    { 
     Thread t1 = new Thread(Method1); 
     Thread t2 = new Thread(Method2); 

     t1.Start(); 
     t2.Start(); 

     Console.ReadLine(); 
    } 

    static void Method1() 
    { 
     a = 5; 
     b = 1; 
    } 

    static void Method2() 
    { 
     if (b == 1) 
      Console.WriteLine(a); 
    } 
} 

Yukarıdaki kodda 5 olarak bir değer alıyorum. Uçucu anahtar kelime kullanmadan nasıl çalışır?

+1

Çalışmıyor. “Uçucu” kullanmayı unuttuğunuz için, 5'ten başka bir değer elde etmeyi beklersiniz. Yine de 5 elde edersiniz. Öyleyse, * bir şeyleri dışarıda bıraktığınız şey olan * çalışma * değil. (Hatayı düzeltin ve gizem gidecektir. İş parçacığı kodlu kodun anlaşılması neredeyse imkansızdır. Sadece düzeltin ve unutun.) –

+0

Bana uçucu için en iyi örneklerden bahseder misiniz? – Gun

+0

Artık, herhangi bir “volatile” anahtar kelimesi olmadan, programın '0' çıkmayacağı ** garantisi yoktur. 0 (bir gün) çıkışı olabilir. Eğer 'volatile' anahtar sözcüğünü eklerseniz, '0' çıkamaz, sadece _either_ no output _or_ '5' verebilirsiniz. –

cevap

11

volatile anahtar sözcüğü derleyiciye, bir değişkenin herhangi bir zamanda değişebileceğini söyler, bu nedenle değişkenin okunmasını ve yazılmasını en iyi duruma getirmemelidir.

böyle bir kod göz önünde bulundurun: Değişken x gibi

int sum; 
for (var i = 0; i < 1000; i++) { 
    sum += x * i; 
} 

, döngü içine değişmez derleyici döngü dışında bir kez değişkeni okuyup sadece döngü boyunca aynı değeri kullanabilir.

x değişkenini değişken yaparsanız, derleyici, her kullanıldığında değişkenin değerini okuyacaktır, böylece değeri farklı bir iş parçacığında değiştirirseniz, yeni değer hemen kullanılacaktır.

2

volatile'u düzgün kullanırsanız, kodunuzun çalışması garanti edilir. Kodunuzun gerektirdiği yerlerde volatile'u bırakırsanız, büyük olasılıkla çoğu zaman iyi çalışır, ancak garanti edilmez ve muhtemelen en çok zarar verdiğinde başarısız olur.

İş parçacığı ırklarının başarısız olduğu veya başarısız olmadığının anlaşılması, uygulamanın ve platformun derinlemesine anlaşılmasını gerektirir. Bu basit ve genellikle endişelenmeye değmez. Sadece kuralları izleyin ve kodunuz her zaman işe yarayacaktır.