Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Volatile和LayoutKind.Explicit在结构上_C#_.net_Multithreading_Mono - Fatal编程技术网

C# Volatile和LayoutKind.Explicit在结构上

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)]

我一直在查找SO和MSDN,但没有找到任何提到struct与LayoutKind.Explicit(它基本上在C#中创建了一个C样式的联合)组合的内容,该组合有一个与其他几个字段重叠的易失性字段,下面是我的代码:

[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的读写将具有不稳定的语义
  • ThreadContextId和ObjectId的读写将不会具有易变语义

  • 因此,如果对非易失性字段的一些访问来自正常分配,而另一些访问则通过
    Thread.volatireRead
    Thread.volatireWrite

    这也是我的理解,或者我期望它能够工作,但我实际上无法从规范源中找到这些信息。我认为“volatile”只会直接影响编译器处理“Packed,“不管那个变量是否共享一个内存位置。Bengie,这就是我上面建议的。@Jon Hanna:我不确定我第一次读它的时候,但现在我又回到它,它确实这么说了。顺便说一句,我不是想说你错了,我只是不确定你说的是否和我想的一样。我需要更多的睡眠。