据我所知,如果没有锁定,线程中的变量应该是不安全的。但我在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的数字,因为没有线程安全,不应该'是吗?所以有人可以告诉我为什么吗?
答案 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这样的大值。