İşte bu davranışın kolektif anlayışına katkım ... Çok fazla değil, sadece değişken bir ayetin davranışını geçici olmayan (yani "normal") bir int değerini yan yana gösteren bir gösteri (xkip'in demosuna dayalı) -side, aynı programda ... Bu konuyu bulduğumda aradığım şey buydu.
using System;
using System.Threading;
namespace VolatileTest
{
class VolatileTest
{
private volatile int _volatileInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _volatileInt = 1; }).Start();
while ( _volatileInt != 1 )
;
Console.WriteLine("_volatileInt="+_volatileInt);
}
}
class NormalTest
{
private int _normalInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _normalInt = 1; }).Start();
while ( _normalInt != 1 )
;
Console.WriteLine("_normalInt="+_normalInt);
}
}
class Program
{
static void Main() {
#if DEBUG
Console.WriteLine("You must run this program in Release mode to reproduce the problem!");
#endif
new VolatileTest().Run();
Console.WriteLine("This program will now hang!");
new NormalTest().Run();
}
}
}
Yukarıda bazı gerçekten mükemmel kısa açıklamalar ve bazı harika referanslar var. Kafamı karıştırmama yardımcı oldukları için herkese teşekkürler volatile
(en azından volatile
ilk içgüdülerimin nerede olduğuna güvenmeyeceğimi bilecek lock
kadar).
Şerefe ve TÜM balıklar için teşekkürler. Keith.
Not: "Ben görmek istiyorum: Çok oldu Orijinal isteğin bir demo, ilgilenen olurdu bir statik uçucu int doğru yerde davrandığını bir statik int kural dışı bir davranışta.
Bu meydan okumayı denedim ve başarısız oldum. (Aslında çok çabuk pes ettim ;-). Statik değişkenlerle denediğim her şeyde, uçucu olup olmadıklarına bakılmaksızın "doğru" davranıyorlar ... ve durum buysa, NEDEN böyle bir açıklama yapmak isterim ... Öyle mi? derleyici, yazmaçlardaki statik değişkenlerin değerlerini önbelleğe almaz (yani, bunun yerine bu yığın adresine bir başvuruyu önbelleğe alır )?
Hayır, bu yeni bir soru değil ... bu, topluluğu orijinal soruya geri döndürme girişimi .