我尝试了一些有问题的情况,其中volatile对.NET Framework有帮助。但是,在.NET Core下,我还没有发现volatile实际上有帮助的一个案例。 .NET Core的内存模型是否比.NET Framework更强,这样我们就不再需要volatile了?
作为示例,如果您使用发布模式构建.net框架,则以下代码会无限期地阻塞,但如果不使用.net内核,则以下代码将无限期阻止。原因是,在.net情况下,该值存储在寄存器中并缓存:
class Program
{
static bool complete = false;
static void Main()
{
var t = new Thread(() =>
{
bool toggle = false;
while (!complete) toggle = !toggle;
});
t.Start();
Thread.Sleep(1000);
complete = true;
t.Join(); // Blocks indefinitely
}
}
答案 0 :(得分:1)
根据this article,C#中的volatile
告诉编译器/ JIT发布防止指令重新排序的指令。尽管通常在Intel平台上.NET的内存模型足够强大,几乎不会发生排序,但是在其他平台(例如ARM)上却一无所知。
换句话说,除非您担心重新排序会破坏代码,否则几乎不需要使用volatile
。同时,在涉及多线程时,最好始终保持安全。