复制结构时,结构指针字段会被撕裂吗?

时间:2019-04-26 01:14:42

标签: c# .net clr

我有这个结构:

[StructLayout(LayoutKind.Sequential)]
public readonly unsafe struct MyStruct
{
    public readonly byte* Pointer;
    public readonly object Owner;
}

大多数操作取决于Pointer字段。我需要将此结构(它作为一个类的一个字段存储)替换为另一个结构,同时该结构被多个线程使用。新的指针仍然具有有效的指针,并且使用struct的所有方法如果多次触摸指针,则会首先将指针缓存为局部变量。 Owner字段仅用于处置某些本机资源。

替换整个结构不是原子的,但是可以将旧指针和新指针无缝替换为调用方法。因此,如果结构的每个字段都被原子替换,我是安全的。我在replace方法和同时使用这两个字段的其他方法中使用了锁。

问题是:即使整个结构可能被撕裂,CLR能否保证以原子方式替换指针字段?

应该是这样,因为即使将结构替换为memcpy,它也将作为类的字段对齐,并且最小的原子副本块是本机int。同样可能该结构不是由memcpy复制的,但是CLR逐字段复制它。但是,如果不是这种情况,我冒着风险引入一个微妙的错误,该错误会因段错误而每隔数百万次调用出现一次,且指针值会部分更新。

0 个答案:

没有答案