为什么Interlocked.Exchange不支持布尔types?
有没有一些实际的原因,为什么.NET团队决定不支持Interlocked.Exchange操作布尔?
其中一个用法示例是当您要保证某些代码只执行一次,并且您想要使用布尔标志。
是的,有一个很好的理由。 互锁方法的实现需要处理器级别的低级支持。 例如,看到这个答案 。 当你定义一个架构不可知的框架时,这是一个问题。
实现Interlocked类所支持的低锁技术对于本地处理器字大小的一小部分是很困难的。 十多年前stream行的cpudevise的RISC方法强烈地阻止了它。 操作数大小和本地内存总线宽度之间的不匹配使得实现非常困难。 英特尔的x86架构仍然在你的大腿上,30年前已经没有走捷径了。 在这个维基百科文章中有关RISC的更多背景信息。
不回答这个问题,但作为一个解决方法,你可以使用int而不是C的方式布尔。
int m_IsFirstTime = 1; // 1 means true 0 means false. void SomeMethod() { if (1 == Interlocked.Exchange(ref m_IsFirstTime , 0)) // Do something for the first time. else // Do something for all other times. }
PS如果有证据表明读取速度比写入速度快,则Interlocked.CompareExchange可能对这种情况更好(首次只有一个,我假设很多不是第一个)。