Этот вопрос НЕ о гоночных условиях, атомарности или о том, почему вы должны использовать блокировки в своем коде. Я уже знаю о них.
UPDATE: Мой вопрос не "существует ли странность с энергозависимой памятью" (я знаю, что это так), мой вопрос: "Это не абстрактное время выполнения .NET, поэтому вы никогда его не увидите".
См. http://www.yoda.arachsys.com/csharp/threads/volatility.shtml и первый ответ на Является ли само свойство string threadsafe?
(Они действительно одна и та же статья, так как одна ссылается на другую.) Один поток устанавливает bool, а другие петли потоков навсегда читают этот bool - эти статьи утверждают, что поток чтения может кэшировать старое значение и никогда не читать новое значение, поэтому вам нужна блокировка (или используйте ключевое слово volatile). Они утверждают, что следующий код будет потенциально замкнутым навсегда. Теперь я соглашаюсь с хорошей практикой блокировки ваших переменных, но я не могу поверить, что среда выполнения .NET действительно игнорирует значение памяти, изменяемое, как утверждает статья. Я понимаю их разговоры о энергозависимой памяти и энергонезависимой памяти, и я согласен, что они имеют правильную точку в не управляемом коде, но я не могу поверить, что среда выполнения .NET не будет правильно абстрагировать ее, чтобы следующий код делал что вы ожидаете. В статье даже признается, что код будет "почти наверняка" работать (хотя и не гарантируется), поэтому я звоню BS по претензии. Может ли кто-нибудь проверить, верно ли, что следующий код не всегда будет работать? Кто-нибудь может получить хотя бы один случай (может быть, вы не всегда можете воспроизвести его), где это не удается?
class BackgroundTaskDemo
{
private bool stopping = false;
static void Main()
{
BackgroundTaskDemo demo = new BackgroundTaskDemo();
new Thread(demo.DoWork).Start();
Thread.Sleep(5000);
demo.stopping = true;
}
static void DoWork()
{
while (!stopping)
{
// Do something here
}
}
}