2

,看到一根碼在線,指出調用這樣一個線程導致這種不確定性輸出「0223557799」什麼的。(你明白了吧)C#多線程按值或引用傳遞?

for (int i = 0; i < 10; i++) 
    new Thread (() => Console.Write (i)).Start(); 

這是由於給出的原因這個:

「問題是i變量在整個循環的整個生命週期中引用了相同的內存位置,因此每個線程都會調用Console.Write,這個變量的值可能隨着它的運行而變化!

但是,傳統上講,當參數值傳遞 - 每個新的線程調用應該發送i它的增量順序權?只有價值觀經過引用,上述理由纔有效。因此,在C#多線程中,值是否通過引用傳遞?

我是C#的新手,請理解問題是否幼稚。

+3

int temp = i;將其置於循環內並通過溫度,slaks是正確的。 – terrybozzio

回答

8

這裏有多個問題。它肯定從這個blog post中描述的for()循環變量捕獲問題開始。這往往會產生「10」作爲輸出,但是不能保證發生這種情況,因爲線程可能在循環仍在迭代時執行。

但是該程序也會遇到核心線程問題,因此不能保證線程將按預期的順序調用Console.Write()。它僅僅是可能是,但是一個線程可能在另一個線程之前跑並獲得保護控制檯的鎖。一個稱爲「threading race」的問題。

+1

這應該是被接受的答案! –

+2

C#5中的更改僅適用於foreach循環,不適用於循環。 –

10

你的程序是等同於以下程序:

class Locals 
{ 
    public int i; 
    public void M() { Console.Write(this.i); 
} 

... 
Locals locals = new Locals(); 
for (locals.i = 0; locals.i < 10; locals.i++) 
    new Thread (locals.M).Start(); 

現在是清楚爲什麼你這樣做的結果?它不是i,它是按價值傳遞的;而是通過參考傳遞給各個線程的locals。每個線程是共享locals.i因此可以看到當前locals.i,而不是線程創建時的值i