我正在學習C#,目前正在學習線程。Interlocked.increment仍然沒有解決價值缺失問題
下面是一個簡單的例子來加1,不同的線程內的可變多次。
本書建議我可以使用Interlocked.increment(ref number)
替換AddOne
方法中的+= 1
,因此該值將被鎖定,直到它在線程中更新爲止。如預期的那樣,輸出將是1000, 2000, ..... 10000
。但我的輸出仍然是999, 1999, 2999, ...... 9999
。
後,才取消對Thread.Sleep(1000)
線將輸出是正確的,但即使沒有被使用Interlocked
。
誰能解釋這裏發生了什麼?
static void Main(string[] args)
{
myNum n = new myNum();
for (int i = 0;i<10; Interlocked.Increment(ref i))
{
for(int a =1;a<=1000; Interlocked.Increment(ref a))
{
Thread t = new Thread(new ThreadStart(n.AddOne));
t.Start();
}
//Thread.Sleep(1000);
Console.WriteLine(n.number);
}
}
class myNum
{
public int number = 0;
public void AddOne()
{
//number += 1;
Interlocked.Increment(ref number);
}
}
實際上,Thread.Sleep(1000)仍然可以正常工作,如果您在AddOne()中執行Thread.Sleep(10),因爲10 << 1000. – Fantius 2011-04-17 00:09:02
感謝您的所有答案,使用for循環中的Interlocked.Increment是書中的示例代碼,我認爲這不是必需的。它等待線程才能完成,非常有用。我會按照你的建議做更多的閱讀。乾杯! – user711657 2011-04-17 00:17:23
@Fantius,這取決於,因爲一次啓動10000個線程可能會壓倒系統,但實際上你在大多數現代系統上都是正確的,它幾乎不明顯。我會更正,謝謝。 – 2011-04-17 00:21:32