using ConsoleApp1;
using System.Diagnostics;
using System.Numerics;
Console.WriteLine("Hello, World!");
Vector3 v1;
int n = 1000000000;
var t1 = new System.Threading.Thread(new ThreadStart(() =>
{
for (int i = 0; i < n; ++i)
{
v1 = new Vector3(1.0F, 1.0F, 1.0F);
}
}));
var t2 = new System.Threading.Thread(new ThreadStart(() =>
{
for (int i = 0; i < n; ++i)
{
v1 = new Vector3(2.0F, 2.0F, 2.0F);
}
}));
var t3 = new System.Threading.Thread(new ThreadStart(() =>
{
for (int i = 0; i < n; ++i)
{
v1 = new Vector3(3.0F, 3.0F, 3.0F);
}
}));
t1.Start();
t2.Start();
t3.Start();
t1.Join();
t2.Join();
t3.Join();
在上面,赋值是原子/线程安全的? 无论是分配 new Vector3(1.0F, 1.0F, 1.0F)、new Vector3(2.0F, 2.0F, 2.0F) 还是 new Vector3(3.0F, 3.0F, 3.0F),顺序都无关紧要。 但我想知道值 v1 会重叠,例如 (1.0F, 3.0F, 2.0F)。
如果它是原子/线程安全的,为什么?
执行结果是值没有重叠。 我认为这与记忆写作有关。 该线程将某个长度的值写入内存,而另一个线程不能同时将该值写入该内存。 正确吗?
v1
变量不包含Vector3
。它持有对 Vector3
的引用,并且三个线程中的每一个都创建并初始化一个完全不同的新的
Vector3
实例。唯一剩下的机会是,在三个 v1
调用之后,三个实例将 join()
引用哪一个。
v1
must 在主线程加入其他三个实例后引用这三个实例之一,无论它引用哪个实例,它都将与线程初始化时完全相同。 (即,它将是 (1, 1, 1)、(2, 2, 2) 或 (3, 3, 3);但它不能是其中任何一个的“混合物”。