Вот мой вклад в коллективное понимание этого поведения ... Это немного, просто демонстрация (на основе демонстрации xkip), которая показывает поведение изменчивого стиха с энергонезависимым (то есть "нормальным") значением int, бок о бок -в той же программе ... это то, что я искал, когда нашел эту ветку.
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();
}
}
}
Выше есть несколько действительно отличных кратких объяснений, а также несколько отличных ссылок. Спасибо всем за то, что помогли мне volatile
сориентироваться (по крайней мере, достаточно, чтобы не полагаться на то, volatile
где был мой первый инстинкт lock
).
Ура и спасибо за ВСЮ рыбу. Кит.
PS: Я бы очень заинтересован в демо исходном запросе, который был: «Я хотел бы видеть в статический летучий Int ведет себя правильно , где это статический Int ведет себя плохо.
Я пробовал и не смог решить эту задачу. (На самом деле я довольно быстро сдался ;-). Во всем, что я пробовал со статическими варами, они ведут себя «правильно» независимо от того, изменчивы они или нет ... и мне бы хотелось получить объяснение, ПОЧЕМУ это так, если это действительно так ... компилятор не кэширует значения статических переменных в регистрах (т.е. вместо этого кэширует ссылку на этот адрес кучи)?
Нет, это не новый вопрос ... это попытка вернуть сообщество к исходному вопросу.