Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否为“Volatile.Read/Volatile.Write”;“双”字;原子的?_C#_.net 4.5 - Fatal编程技术网

C# 是否为“Volatile.Read/Volatile.Write”;“双”字;原子的?

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 从不同线程读/写双线程

MSDN声明

long、ulong、double和decimal以及用户定义的类型不能保证是原子类型

会像原子操作一样工作吗?如果是,如何保证这一点

执行Volatile.Write(ref mydouble,value)是否安全
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推荐的优化,你有什么好的链接吗?