2016-02-13 104 views
0

我學習揮發,聯鎖和鎖在C#中,寫了下面的代碼,而無需使用任何這些同步結構的打印奇數和偶數,我跑這個代碼幾次,總是給正確答案,爲什麼此代碼的工作,而不是崩潰

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace microsoft 
{ 
    class th2_odd_event 
    { 
     static int num = 1; 
     static bool guard = false; 
     public void init() 
     { 
      Thread th = new Thread(print_odd); 
      Thread th2 = new Thread(print_even); 
      th.Start(); 
      th2.Start(); 

     } 
     public static void print_odd() 
     { 
      while (true) 
      { 
       if (guard == false) 
       { 
        if (num % 2 != 0) 
        { 
         Console.WriteLine(num); 
         num++; 
        } 

        guard = true; 
       } 
       if (num > 20) 
        break; 
      } 
     } 

     public static void print_even() 
     { 
      while (true) 
      { 
       if (guard == true) 
       { 
        if (num % 2 == 0) 
        { 
         Console.WriteLine(num); 
         num++; 
        } 
        guard = false; 
       } 

       if (num > 20) 
        break; 
      } 
     } 

    } 

代碼的工作原理?這是幸運的,兩個線程之間沒有衝突?我失去了一些東西......

回答

1

還沒有嘗試過了,但只是通過觀察,它似乎是2個線程只是運行獨家while循環,如果你認爲作爲鎖定/互斥鎖變量的「後衛」變量。

當奇數線程運行的循環中,邏輯部分被擊中,只有在「守衛」是假的。此時,偶數線程只會執行一個無操作while循環,因爲守衛不是真的。 (只讀,如果檢查是安全的)

最後,當奇數線程將警衛設置爲真時,它是自己的,如果檢查將返回false,並且偶數線程的檢查將變爲true,並且它將開始打印偶數。

然後循環重複,線程幾乎完全工作。 'guard'變量只在if塊的末尾被改變,在原子分配中,因此2個線程不會真正發生衝突。

這就是您可能沒有得到任何問題的原因。

+0

謝謝拉賈! :) – Sandeep