我一直在寻找SO和MSDN,但是还没有找到任何提到结构与LayoutKind.Explicit(它基本上在C#中创建一个C风格的联合)的组合,它有一个volatile字段这与我的代码重叠:
[StructLayout(LayoutKind.Explicit)]
public struct ThreadContextId
{
[FieldOffset(0)]
public byte ServerNumber;
[FieldOffset(1)]
public byte ThreadNumber;
[FieldOffset(0)]
public short Packed;
}
[StructLayout(LayoutKind.Explicit)]
public struct ThreadObjectId
{
[FieldOffset(0)]
public ThreadContextId ThreadContextId;
[FieldOffset(2)]
public ushort ObjectId;
[FieldOffset(0)]
public volatile uint Packed;
}
正如您所看到的,它是ThreadObjectId结构中的最后一个字段,它覆盖了先前定义的struct和ThreadObjectId结构中的ushort。这会“按预期”工作,我指的是一个易失性的uint如何在正常的顺序结构或引用类型上工作。
答案 0 :(得分:2)
如果我被证明是错的,我不会感到惊讶,但我的理解是:
ref
,则不会,但大部分时间都是如此)。因此,如果对非易失性字段的某些访问来自正常分配,而某些访问来自Thread.VolatileRead
和Thread.VolatileWrite
,那就更好了。