2017-05-30 67 views
-3

我想知道這一刻。我只是讀了一些關於線程和降落在那裏:任務與線程差異[複製]來自Jacek的stackoverflow(對不起,不能創建一個鏈接,因爲我只能使用聲譽<)同時運行線程給出不同的數字

和第一條評論來自MoonKnight帶我到那裏:albahari.com/threading

我已經採取了代碼,並改變了一點,使其更好地閱讀能夠發生什麼。這裏說到我改變的代碼:

static void Main() 
    { 
     Thread t = new Thread(WriteY);   // Kick off a new thread 
     t.Start();        // running WriteY() 

     // Simultaneously, do something on the main thread. 
     for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1); Console.Write(i); }; 
     Console.ReadLine(); 
    } 

    static void WriteY() 
    { 
     for (int y = 0; y < 10; y++) { System.Threading.Thread.Sleep(1); Console.Write(y); }; 
     Console.ReadLine(); 
    } 

我的預期發生(會發生什麼,大部分的時間)是這樣的: 好主題: enter image description here

但這裏是我想知道的東西(它絕對隨機並承諾相同的代碼):

奇蹟螺紋:

enter image description here

我的問題:

1.這是怎麼發生的,有不同的數字線程應該始終運行在同一時間不應該他們?

2.所有這變得更加瘋狂的睡眠時間變得如此,如果你刪除它完全是荒原絕對隨機下部

+4

*「線程應該總是在同一時間運行?」* - 沒有。想象一下,如何保證兩個線程中的兩個循環在每個步驟中都同步。這是可能的,但你必須寫出相當數量的代碼才能實現。計算機上正在運行許多許多進程和線程。他們每個人都有一點時間去做自己的事情。線程是凌亂的。如果兩個運行相同代碼的線程總是碰巧在用戶看來是同一時刻做同樣的事情,那麼聖誕老人級的奇蹟就是如此。 –

+0

如果你想同步它們,使用適當的機制 –

+0

@ed我看到感謝您的快速答案 – Pr0gr4mm3r

回答

0

當你執行主線程上的第一個環和一個單獨的線程開始WriteY(),有絕對沒有辦法預測一個線程中的事件相對於另一個線程中的事件發生的順序。

我已經寫了一些測試來證明這一點。 Here's one。和here's another

這兩個例子的特徵是它們經常以「預期」順序運行,但偶爾它們不會。

這告訴我們關於多線程操作的幾件事情:

  • Concurrencty或並行執行是有益的,當我們想在線程之間分配工作,而不是在事件發生,必須以可預測的順序。
  • 它需要特別小心,因爲如果我們做錯了,它似乎無論如何工作。然後偶爾會失效。那些無法正常工作的場合將非常難以調試,其中一個原因是您無法在需要時重複這些行爲。
相關問題