关键是:它可能会起作用,但不能 保证
该规范能起作用。人们通常所追求的是能够以正确的理由工作的代码,而不是通过编译器,运行时和JIT的偶然组合来工作,这些代码 可能会
在框架版本,物理CPU,平台以及x86与x64。
了解内存模型是一个非常非常复杂的领域,我并不声称自己是专家。但是在这方面 是 真正专家的人向我保证,您所看到的行为无法得到保证。
您可以根据需要发布任意数量的工作示例,但是不幸的是,除了“它通常可以工作”之外,它并没有得到太多证明。当然不能证明它可以 保证
正常工作。只需反驳一个例子,但发现这就是问题所在…
不,我没有手。
使用可重复的反例进行更新:
using System.Threading;using System;static class BackgroundTaskDemo{ // make this volatile to fix it private static bool stopping = false; static void Main() { new Thread(DoWork).Start(); Thread.Sleep(5000); stopping = true; Console.WriteLine("Main exit"); Console.ReadLine(); } static void DoWork() { int i = 0; while (!stopping) { i++; } Console.WriteLine("DoWork exit " + i); }}输出:
Main exit
但仍在全CPU下运行;请注意,此时
stopping已设置为
true。的
ReadLine是,这样的过程不会终止。优化似乎取决于循环内代码的大小(因此
i++)。显然,它仅在“发布”模式下有效。添加
volatile,一切正常。



