Oto mój wkład w zbiorowe zrozumienie tego zachowania ... To niewiele, tylko demonstracja (oparta na demo xkipa), która pokazuje zachowanie niestabilnych wersetów nieulotną (tj. „Normalną”) wartość int, obok -z boku, w tym samym programie ... czego szukałem, gdy znalazłem ten wątek.
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();
}
}
}
Powyżej znajduje się kilka naprawdę doskonałych zwięzłych wyjaśnień, a także kilka świetnych odniesień. Dziękuję wszystkim za pomoc w poruszaniu się po głowie volatile
(przynajmniej na tyle, żeby wiedzieć, volatile
gdzie był mój pierwszy instynkt lock
).
Pozdrawiam i dziękuję za WSZYSTKIE ryby. Keith.
PS: Byłbym bardzo zainteresowany w demo pierwotnego wniosku, który brzmiał: „Chciałbym zobaczyć jak statyczny lotnych int poprawnie zachowuje się w miarę do statycznej int misbehaves.
Próbowałem i zawiodłem to wyzwanie. (Właściwie zrezygnowałem dość szybko ;-). We wszystkim, co wypróbowałem ze statycznymi zmiennymi, zachowują się „poprawnie” niezależnie od tego, czy są niestabilne, czy nie ... i chciałbym wyjaśnić, DLACZEGO tak jest, jeśli rzeczywiście tak jest ... kompilator nie buforuje wartości zmiennych statycznych w rejestrach (tj. zamiast tego buforuje odniesienie do tego adresu sterty)?
Nie, to nie jest nowe pytanie ... to próba skierowania społeczności z powrotem na pierwotne pytanie.