赋值是原子/线程安全的吗?

问题描述 投票:0回答:1
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)。

如果它是原子/线程安全的,为什么?

执行结果是值没有重叠。 我认为这与记忆写作有关。 该线程将某个长度的值写入内存,而另一个线程不能同时将该值写入该内存。 正确吗?

c# thread-safety
1个回答
0
投票

v1
变量不包含
Vector3
。它持有对 Vector3
引用
,并且三个线程中的每一个都创建并初始化一个完全不同的新的
Vector3
实例。唯一剩下的机会是,在三个
v1
调用之后,三个实例将
join()
引用哪一个。

v1
must 在主线程加入其他三个实例后引用这三个实例之一,无论它引用哪个实例,它都将与线程初始化时完全相同。 (即,它将是 (1, 1, 1)、(2, 2, 2) 或 (3, 3, 3);但它不能是其中任何一个的“混合物”。

© www.soinside.com 2019 - 2024. All rights reserved.