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如何在正常的顺序结构体或引用类型上工作?
如果我被证明是错的,我不会感到惊讶,但我的理解是:
- 在自动布局的情况下,pack的读写将具有易失性语义(例如,如果不是通过
ref
,但大多数时候会)。 - ThreadContextId和ObjectId的读写没有volatile语义。
因此,如果对非易失性字段的一些访问是通过正常赋值,而另一些访问是通过Thread.VolatileRead
和Thread.VolatileWrite
。