簡體   English   中英

統一螺紋中的可變安全性

[英]variable safety in unity thread

據我所知,如果未鎖定,線程中的變量應該是不安全的。 但是我在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;
        }
    }

, and every times I try it that is 10000. But it should be a number which is less than 10000 because of not thread safety, shouldn't it? 並且我嘗試使用 ,每次嘗試都為10000。但是由於不是線程安全性,它應該是小於10000的數字,不是嗎? 誰能告訴我為什么?

這是代碼的最小,完整和可驗證的示例

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

該線程需要一些時間來計划啟動。 主線程可能會在另一個線程開始之前完成增量。 嘗試使用較大的值,例如50000000。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM