Volatile和LayoutKind.在结构上显式

本文关键字:结构上 LayoutKind Volatile | 更新日期: 2023-09-27 18:17:10

我一直在寻找SO和MSDN,但没有找到任何提到结构体与LayoutKind组合的东西。显式(它基本上在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结构体中的最后一个字段,覆盖了之前定义的结构体和ThreadObjectId结构体中的ushort。这是否"如预期的那样"工作,我的意思是volatile int如何在正常的顺序结构体或引用类型上工作?

Volatile和LayoutKind.在结构上显式

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

  1. 在自动布局的情况下,pack的读写将具有易失性语义(例如,如果不是通过ref,但大多数时候会)。
  2. ThreadContextId和ObjectId的读写没有volatile语义。

因此,如果对非易失性字段的一些访问是通过正常赋值,而另一些访问是通过Thread.VolatileReadThread.VolatileWrite