值类型的分配是否在.Net 中被认为是原子的?
例如,考虑以下程序:
struct Vector3
{
public float X { get; private set; }
public float Y { get; private set; }
public float Z { get; private set; }
public Vector3(float x, float y, float z)
{
this.X = x;
this.Y = y;
this.Z = z;
}
public Vector3 Clone()
{
return new Vector3(X, Y, Z);
}
public override String ToString()
{
return "(" + X + "," + Y + "," + Z + ")";
}
}
class Program
{
private static Vector3 pos = new Vector3(0,0,0);
private static void ReaderThread()
{
for (int i = 0; i < int.MaxValue; i++)
{
Vector3 v = pos;
Console.WriteLine(v.ToString());
Thread.Sleep(200);
}
}
private static void WriterThread()
{
for (int i = 1; i < int.MaxValue; i++)
{
pos = new Vector3(i, i, i);
Thread.Sleep(200);
}
}
static void Main(string[] args)
{
Thread w = new Thread(WriterThread);
Thread r = new Thread(ReaderThread);
w.Start();
r.Start();
}
}
像这样的程序会遭受高级数据竞赛的困扰吗?甚至是数据竞赛?
我想在这里知道的是:是否有任何可能性 v 将包含:
- 由于可能的数据竞争导致的垃圾值
- 指代分配前的位置和分配后的位置的混合组件 X、Y 或 Z。例如,如果 pos = (1,1,1) 然后为 pos 分配新值 (2,2,2) 可以 v = (1,2,2) 吗?