我有这个结构:
[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逐字段复制它。但是,如果不是这种情况,我冒着风险引入一个微妙的错误,该错误会因段错误而每隔数百万次调用出现一次,且指针值会部分更新。