因为只有引用类型和一些基元(包括 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.Read
和 Interlocked.Exchange
与BitConverter.Int64BitsToDouble
一起作用于多头和 BitConverter.DoubleToInt64Bits
.您可以将其封装在 VolatileDouble
结构中。 (我可能会将其设为结构而不是类。)
关于C# volatile double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/531759/