Memory model and compiler optimizations are not directly related to concurrency, but they are very important concepts for anyone who creates concurrent code, shown as follows:
class Program { bool _loop = true; static void Main(string[] args) { var p = new Program(); Task.Run(() => { Thread.Sleep(100); p._loop = false; }); while (p._loop); //while (p._loop) { Console.Write(".");}; Console.WriteLine("Exited the loop"); } }
If you compile this with the Release build configuration and JIT compiler optimizations enabled, the loop will usually hang on the x86 and x64 architectures. This happens because JIT optimizes the p._loop read and does something like this:
if(p._loop) { while(true); }
If there is something inside the while loop, JIT will probably not optimize this code in this way. Also, we may use the volatile keyword with the Boolean flag like this:
volatile bool _loop;
In this case, JIT will turn...