When I run the following code in debug mode, it’ll successfully finish and exit. However, if I run the following code in release mode, it’ll get stuck in an infinite loop and never finish.
static void Main(string[] args)
{
bool stop = false;
new Thread(() =>
{
Thread.Sleep(1000);
stop = true;
Console.WriteLine("Set \"stop\" to true.");
}).Start();
Console.WriteLine("Entering loop.");
while (!stop)
{
}
Console.WriteLine("Done.");
}
Which optimization is causing it to get stuck in an infinite loop?
My guess would be processor caching of the
stopvariable on the main thread. In debug mode the memory model is stricter because the debugger needs to be able to provide a sensible view of the variable’s state across all threads.Try making a field and marking it as volatile: