Вот мой вклад в коллективное понимание этого поведения ... Это не так много, просто демонстрация (на основе демо xkip в), который показывает поведение летучих стихов энергонезависимого (т.е. «нормальный») int value, бок о бок, в той же программе ... что я искал, когда нашел эту нить.
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)
; // Do nothing
Console.WriteLine("_volatileInt="+_volatileInt);
}
}
class NormalTest
{
private int _normalInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _normalInt = 1; }).Start();
// NOTE: Program hangs here in Release mode only (not Debug mode).
// See: http://stackoverflow.com/questions/133270/illustrating-usage-of-the-volatile-keyword-in-c-sharp
// for an explanation of why. The short answer is because the
// compiler optimisation caches _normalInt on a register, so
// it never re-reads the value of the _normalInt variable, so
// it never sees the modified value. Ergo: while (true)!!!!
while (_normalInt != 1)
; // Do nothing
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();
}
}
}
Есть несколько действительно отличных кратких объяснений выше, а также некоторые замечательные ссылки. Спасибо всем за то, что помогли мне окунуться в volatile
(по крайней мере, чтобы знать, не полагайтесь на volatile
, где мой первый инстинкт был lock
).
Приветствия, и спасибо за ВСЕ рыбу. Кит.
PS: Я был бы очень заинтересован в демо исходном запросе, который был: «Я хотел бы видеть в статического летучего INT ведет себя правильно, где статических INT. ведет себя плохо
Я пытался и не на этот вызов. (на самом деле я сдался довольно быстро ;-). Во всем, что я пытался со статическими переменными они ведут себя «правильно», независимо от того, или нет, вы их volatile ... и мне хотелось бы объяснить ПОЧЕМУ, что это так, если это действительно так ... Неужели компилятор не кэширует значения значений статических варов в регистрах (т. он кэширует ссылку на на этот куча-адрес)?
Нет, это не новый вопрос ... это попытка стереть сообщество назад в исходный вопрос.
http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/ – Xaqron 2010-10-26 00:52:49
следить за Джо Даффи на 'летучего' ключевое слово. http://www.bluebytesoftware.com/blog/2010/12/04/SayonaraVolatile.aspx – 2012-05-22 16:12:37