我可能在這裏錯過了一些基本的東西,但仍然會感謝您的理解幫助。所以,我有以下簡單的多線程程序我寫道:簡單的C#併發/多線程
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
// List<int> outcome = new List<int>();
Test t = new Test();
Thread thread1 = new Thread(new ThreadStart(t.call1));
Thread thread2 = new Thread(new ThreadStart(t.call2));
thread1.Start();
thread2.Start();
Thread.Sleep(3000); //Give enough time for threads to end
Console.Write("{0},", t.mSum);
t.mSum = 0;
}
}
class Test
{
public int mSum = 0;
public void call1()
{
//lock (this)
//{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Hello Thread 1, mSum value: {0}", mSum);
mSum = mSum + 1;
Console.WriteLine("Goodbye Thread 1, mSum value: {0}", mSum);
}
//}
// Console.WriteLine(mSum);
}
public void call2()
{
for (int i = 0; i < 100 ; i++)
{
Console.WriteLine("Hello Thread 2, mSum value: {0}",mSum);
mSum = mSum + 1;
Console.WriteLine("Goodbye Thread 2, mSum value: {0}",mSum);
}
}
}
}
所以我希望這個輸出是nondetermenistic因爲可以隨時發生正確的上下文切換?但是,當我運行程序時,我得到下面的輸出(只輸出的一部分,畸形是由於我可憐stackoverflow.com問題張貼技能):
Hello Thread 1, mSum value: 62 Goodbye Thread 1, mSum value: 63 Hello Thread 1, mSum value: 63 Goodbye Thread 1, mSum value: 64 Hello Thread 2, mSum value: 59 Goodbye Thread 2, mSum value: 65 Hello Thread 2, mSum value: 65 Goodbye Thread 2, mSum value: 66
因此,假設我寫了這個權利,並MSUM確實在線程之間共享(看起來像是......) - 我怎樣才能解釋線路號碼? 3?線程2讀取59,加1,然後我們得到65!
我發現了一種新的數學嗎? :)
這是按照正確的順序,沒有重組?該代碼顯示,「Hello」行和「Goodbye」行之間應該有一個換行符,如果你刪除了它,那很好,我只是試着去確定它已經到了「Hello 1,再見1 ... 2你好,再見2" 如果你知道我的「米說 –
是順序是正確的:左到右,然後由底部(62-> 63,63-> 64,59-> 65, 65-> 66)。我試圖在這裏添加一個圖像,但不能。 – Tal