C# Volatile和LayoutKind.Explicit在结构上
我一直在查找SO和MSDN,但没有找到任何提到struct与LayoutKind.Explicit(它基本上在C#中创建了一个C样式的联合)组合的内容,该组合有一个与其他几个字段重叠的易失性字段,下面是我的代码:C# Volatile和LayoutKind.Explicit在结构上,c#,.net,multithreading,mono,C#,.net,Multithreading,Mono,我一直在查找SO和MSDN,但没有找到任何提到struct与LayoutKind.Explicit(它基本上在C#中创建了一个C样式的联合)组合的内容,该组合有一个与其他几个字段重叠的易失性字段,下面是我的代码: [StructLayout(LayoutKind.Explicit)] public struct ThreadContextId { [FieldOffset(0)] public byte ServerNumber; [FieldOffset(1)]
[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 uint如何在正常的顺序结构或引用类型上工作。如果我被证明是错的,我不会感到惊讶,但我的理解是:
ref
,但在大多数情况下),Packed的读写将具有不稳定的语义因此,如果对非易失性字段的一些访问来自正常分配,而另一些访问则通过
Thread.volatireRead
和Thread.volatireWrite
这也是我的理解,或者我期望它能够工作,但我实际上无法从规范源中找到这些信息。我认为“volatile”只会直接影响编译器处理“Packed,“不管那个变量是否共享一个内存位置。Bengie,这就是我上面建议的。@Jon Hanna:我不确定我第一次读它的时候,但现在我又回到它,它确实这么说了。顺便说一句,我不是想说你错了,我只是不确定你说的是否和我想的一样。我需要更多的睡眠。