Режим отладки/релиза — другое поведение

Два потока (основной поток и другой поток с именем T) имеют доступ к одному и тому же логическому полю. T ничего не делает, кроме while (_bool) { }, а Main присваивает false _bool через 2 секунды.

При отладке T выходит из цикла.

При выпуске T никогда не выходит из цикла.

Почему?

РЕДАКТИРОВАТЬ:

Более того, почему volatile на _bool это решает?

using System;
using System.Threading;

namespace ConsoleApplication1
{
    internal class Program
    {
        private bool _bool = true;

        private static void Main()
        {
            var program = new Program();
            var t = new Thread(SomeThread);
            t.Start(program);

            Thread.Sleep(2000);
            program._bool = false;
            Console.WriteLine(program._bool);
        }

        private static void SomeThread(object obj)
        {
            var p = obj as Program;
            Console.WriteLine("Entered loop");
            while (p._bool)
            {

            }
            Console.WriteLine("Exited Loop");
        }
    }
}

person johni    schedule 11.01.2016    source источник
comment
вы должны использовать блокировку при чтении/записи _bool.   -  person Daniel A. White    schedule 11.01.2016
comment
Ваша переменная не является летучей   -  person Scott Chamberlain    schedule 11.01.2016
comment
Отметьте свою переменную как volatile, иначе код выпуска может кэшировать ее значение для разных потоков.   -  person Gusman    schedule 11.01.2016
comment
stackoverflow .com/questions/72275/   -  person Daniel A. White    schedule 11.01.2016
comment
Отредактировал вопрос относительно Volatile.   -  person johni    schedule 11.01.2016