为什么没有Volatile.Read(ref T location)其中T:struct?

时间:2017-03-11 21:40:59

标签: c# multithreading thread-safety volatile

所有基元和引用类型都有Volatile.Read方法,为什么结构没有Volatile.Read?同样适用于Volatile.Write。同样,旧的Thread.VolatileRead方法也没有结构。

这背后的原因是什么?我可以在类中声明volatile结构,为什么我不能用这些方法进行volatile读取?

1 个答案:

答案 0 :(得分:3)

如果它们也是原子的,那么在易失性操作中只有一个保证,除了最简单的结构(例如,基元或引用类型的一个字段,或任何适合64位/的结构)之外的所有结构都不是这种情况。 8个字节)。

例如,您对768位/ 96字节结构上的此类Volatile方法有何期待?任何大于最大支持的原子操作的东西实际上都会导致多个易失性写入,每个写入都会立即可见而没有任何保证。

在.NET的Microsoft实现中,long和double Volatile方法是原子的。即使在32位架构上,也要以在这种架构中使用互锁操作为代价。