根据C#规范,是否有任何保证foo.Bar
将具有原子相同的效果(即,当由不同线程写入时,从不同线程读取foo.Bar
永远不会看到部分更新的结构)?可以在C#中装箱/拆箱一个结构给它原子相同的效果?
我一直认为它的确如此。如果确实如此,我想知道规范是否能保证它。
public class Foo<T> where T : struct
{
private object bar;
public T Bar
{
get { return (T) bar; }
set { bar = value; }
}
}
// var foo = new Foo<Baz>();
编辑:@vesan这不是Atomic Assignment of Reference Sized Structs的副本。这个问题要求装箱和拆箱的效果,而另一个是关于结构中的单个引用类型(不包括装箱/取消装箱)。这两个问题之间唯一的相似之处是struct和atomic这两个词(你是否真的阅读过这个问题?)。
EDIT2:下面是基于Raymond Chen的答案原子弹版本:
public class Atomic<T> where T : struct
{
private object m_Value = default(T);
public T Value
{
get { return (T) m_Value; }
set { Thread.VolatileWrite(ref m_Value, value); }
}
}
可能重复的[参考大小结构的原子分配](http://stackoverflow.com/questions/ 6992862 /原子分配的参考大小的结构) – vesan
@vesan它不是重复的 - 看起来你根本不理解这个问题。 –
@vesan我认为这是不正确的重复,因为这个问题是关于拆箱的结构是原子或不是,而建议的副本是关于整个结构只是参考。答案可能是同一部分规范,但具有不同的实现。 –