我需要这个字段是不稳定的吗?

noc*_*ura 9 .net c# multithreading volatile

我有一个旋转的线程,直到另一个线程更改的int是某个值.

int cur = this.m_cur;
while (cur > this.Max)
{
    // spin until cur is <= max
    cur = this.m_cur; 
}
Run Code Online (Sandbox Code Playgroud)

this.m_cur是否需要声明为volatile才能生效?由于编译器优化,它是否有可能永远旋转?

Han*_*ant 12

是的,这是一个很难的要求.允许即时编译器将m_cur的值存储在处理器寄存器中,而无需从内存中刷新它.实际上x86抖动确实存在,x64抖动没有(至少我最后一次看它).

需要使用volatile关键字来抑制此优化.

易失性意味着Itanium内核,一个内存模式较弱的处理器完全不同.不幸的是,它成为了MSDN库和C#语言规范的原因.它在ARM核心上意味着什么还有待观察.

  • 我喜欢你如何回答他的问题,而不是像许多人那样说"做另一种方式".根据他的需要,信号可能更有效率,但他的问题不是"......还是什么更好?" 此外,我相信很多用途都在这里学到了新东西.谢谢. (4认同)