统一线程中的可变安全性

时间:2017-02-22 02:13:57

标签: c# multithreading unity3d thread-safety

据我所知,如果没有锁定,线程中的变量应该是不安全的。但我在Unity上试过它,发现它有所不同。 我尝试下面的代码:

    void Awake () {
        Thread thread = new Thread(new ThreadStart (demo));
        thread.Start ();
        for (int i = 0; i < 5000; i++) {
            count = count + 1;
        }
    }

    void demo() {
        for (int i = 0; i < 5000; i++) {
            count = count + 1;
        }
    }

我尝试 Debug.Log(count),并且每次尝试它都是10000.但它应该是一个小于10000的数字,因为没有线程安全,不应该'是吗?所以有人可以告诉我为什么吗?

2 个答案:

答案 0 :(得分:2)

这是您的Minimal, Complete, and Verifiable example代码:

void Main()
{
    Awake();
    Console.WriteLine(count);
}

private int count = 0;

public void Awake()
{
    Thread thread = new Thread(new ThreadStart(demo));
    thread.Start();
    for (int i = 0; i < 5000; i++)
    {
        count = count + 1;
    }
    thread.Join();
}

public void demo()
{
    for (int i = 0; i < 5000; i++)
    {
        count = count + 1;
    }
}

如果你跑了,你会得到10000。这是因为在线程启动时,.Awake()方法已完成其循环,因此不会发生冲突。

尝试将循环更改为for (int i = 0; i < 50000; i++),然后我为一次运行获得的结果为89922。它每次都会改变,但有时我仍会得到100000

答案 1 :(得分:0)

线程需要一些时间来安排启动。主线程可能会在另一个线程启动之前完成增量。尝试使用像50000000这样的大值。