C# 是否为“Volatile.Read/Volatile.Write”;“双”字;原子的?
MSDN声明 long、ulong、double和decimal以及用户定义的类型不能保证是原子类型 会像原子操作一样工作吗?如果是,如何保证这一点 执行Volatile.Write(ref mydouble,value)是否安全一个线程中的code>和C# 是否为“Volatile.Read/Volatile.Write”;“双”字;原子的?,c#,.net-4.5,C#,.net 4.5,MSDN声明 long、ulong、double和decimal以及用户定义的类型不能保证是原子类型 会像原子操作一样工作吗?如果是,如何保证这一点 执行Volatile.Write(ref mydouble,value)是否安全和Volatile。在另一个线程中读取(ref mydouble),其中mydouble具有double类型 这是一个普遍的问题。另一个问题——在这种特殊情况下,我应该怎么做: x64服务器上的2个处理器 Windows+MS.NET 4.5 从不同线程读/写双线程
Volatile。在另一个线程中读取(ref mydouble)
,其中mydouble
具有double
类型
这是一个普遍的问题。另一个问题——在这种特殊情况下,我应该怎么做:
- x64服务器上的2个处理器
- Windows+MS.NET 4.5
- 从不同线程读/写双线程
- 最小延迟(需要最小延迟,因为我正在编写HFT软件)
联锁
,而不是联锁。交换
或联锁。读取
更新:不,Volatile不是原子的,在SMP(>1处理器)系统中假设这样做是不安全的。它在单处理器机器上是安全的。如果您真的那么在意延迟,那么您需要停止从不同线程写入同一位置。你能详细介绍一下你正在解决的问题吗?@javapowered就我个人而言,我不知道“volatile”(双精度)是否意味着原子。因此,我个人只会在进行无锁访问时使用“联锁”。事实上,即使在x64上也可以使用联锁,因为(芯片大小的副作用)它几乎肯定是原子的。因此,我不得不同意,“使用联锁”是这个问题最合适的答案。@MarcGravel何时应该使用“Volatile”类?它变得无用了。只要始终使用“Interlocated”?如果你引起一个额外的页面错误,它就会抹去成千上万个不稳定调用的收益。页面错误和优化内存位置(即数组与列表)将使您获得更高的性能优势。阅读XNA人员推荐的一些优化内容,他们在这方面有很多好的东西。@MarcGravel我认为这是一个常见的误解,因为MSDN文档中有一条声明,人们认为Interlocated对于大于32位的值不是原子的。然而,这一切都取决于它所运行的体系结构。如果在x64上运行,则联锁是64位值类型的原子。我基本上怀疑volatile是相同的(即x64系统上双字节/长字节/8字节值类型的原子)。更多在这里。PS我通过查看API的名称得出了这一结论,我100%确定Interlocked是原子的,用于8字节的值x64@PaulBetts关于XNA推荐的优化,你有什么好的链接吗?