结构上的Volatile和LayoutKind.Explicit

时间:2011-12-07 19:17:44

标签: c# .net multithreading mono

我一直在寻找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如何在正常的顺序结构或引用类型上工作。

1 个答案:

答案 0 :(得分:2)

如果我被证明是错的,我不会感到惊讶,但我的理解是:

  1. Packed的读写将在自动布局的情况下具有易失性语义(例如,如果通过ref,则不会,但大部分时间都是如此)。
  2. ThreadContextId和ObjectId的读写不会有易失性语义。
  3. 因此,如果对非易失性字段的某些访问来自正常分配,而某些访问来自Thread.VolatileReadThread.VolatileWrite,那就更好了。