C# volatile double

标签 c# .net volatile

因为只有引用类型和一些基元(包括 float,但不包括 double,我不确定原因,我很高兴听到原因)可以声明为 volatile,如果我在类中包装 double然后将其声明为 volatile(如下所示),double 属性是否会像任何其他 volatile 一样是“读写”线程安全的,还是我仍然应该考虑锁定?

public class MyThreadedClass
{
    volatile VolatileDouble voldub;
}

public class VolatileDouble
{
    public double Double { get; set; }
}

最佳答案

double 不能被声明为 volatile 的原因:它是 64 位,这使得它超过了 x86 上的字长,如果我没记错的话,这可以防止它在 CLI 中被声明为 volatile。

根据您当前的回答,只有引用 被视为易变的。这意味着内存模型将确保它始终使用最新的引用,但它仍然可以使用过时的值。

如果我是你,我会使用锁定,但另一种选择是使用 Interlocked.ReadInterlocked.ExchangeBitConverter.Int64BitsToDouble一起作用于多头和 BitConverter.DoubleToInt64Bits .您可以将其封装在 VolatileDouble 结构中。 (我可能会将其设为结构而不是类。)

关于C# volatile double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/531759/

相关文章:

c# - 在哪里可以找到 MSDN 库图标的含义?

c# - 什么是 ObjectFactory.Inject 在 StructureMap 3.0 中的等价物

java - 正确理解 volatile、syncronized 和 AtomicReference 等概念?

c++ - 为什么 volatile 在多线程 C 或 C++ 编程中没有用?

c# - 每个 HttpContext 实例一个对象

c# - 如何在我的 ASP.NET 应用程序中长时间使用 Session

C# 数学与 XNA MathHelper

c# - 是否存在任何NON-GPL/AGPL病毒扫描库?

生成服务器上的 ASP.NET v5

java - 为什么我们不需要带有 StampedLock 的 volatile?