none
lock 的觀念 RRS feed

  • 問題

  • 之前有提問過 相關的問題

    現在 我被一個 自己程式的寫法 卡住

    再請教一下各位

    我在程式中 有一個 DataTable 會隨時 去更新其內容 更新時我是這樣寫的

    lock(DT.Rows.SyncRoot)

    {

    //更新DataTable 的內容

    }

    若我在其它地方 我想要取出其內容 

    我就這樣去寫

    lock (DT.Rows.SyncRoot)

    {

      DataRow[] m_foundrow=m_DT.select(...);

    }

    //以下處理 m_foundrow 的資料

    ------------------------------------------------------------------------------

    我卡住的地方是 

    1.  在之前所問 lock 所 包的區塊 是取決於 lock(DT.Rows.SyncRoot)

        DT.Rows.SyncRoot 是一把鑰匙

        那到底 程式會不會把它DT 這個 datatable 先鎖住不讓別人讀取

    2. 到底在使用 lock 時  是必免 unthreadsafe  的關西

       但 在我這個程式邏輯  其實  就是  因為 有一段程式會去 隨時 不定期更新DataTable

       又有另外一段程式會去  取其中資料 

       我怕 會有  讀取衝突的問題  所以 用lock

       可否 請高手們  能詳說 lock 的觀念呢

    3. 依照 我這樣的狀況 是否需要去 lock 呢

       到底使用時機  該怎麼取思考架構 

       寫進去 DataTable 與 讀取 DataTable 分別在不同的程式

       但此DataTable 是設成 static 的

       

      

     

    2010年6月17日 上午 08:59

解答

  • lock鎖定的是程式碼區塊,而不是物件。以下面的程式來看,大括號內是Critical Section,同時只會有一條執行緒在執行這個區塊的程式碼。

    lock(obj){
      //do something
    }

     

    所以當ThreadA正在上述區塊執行,而同時間有另一條ThreadB正在跑以下的程式碼,那麼是可以順利執行而不會被鎖定的。

    string str = obj.ToString();

     

    除非ThreadB也使用了lock,這個時候才會等ThreadA退出Critical Section之後才讓ThreadB執行obj.ToString(),例如:

    lock(obj){
      string str = obj.ToString();
    }

     

    以上,純屬小弟個人愚見。

     

    • 已標示為解答 布利 2010年6月22日 上午 01:57
    2010年6月18日 上午 03:42

所有回覆

  • lock鎖定的是程式碼區塊,而不是物件。以下面的程式來看,大括號內是Critical Section,同時只會有一條執行緒在執行這個區塊的程式碼。

    lock(obj){
      //do something
    }

     

    所以當ThreadA正在上述區塊執行,而同時間有另一條ThreadB正在跑以下的程式碼,那麼是可以順利執行而不會被鎖定的。

    string str = obj.ToString();

     

    除非ThreadB也使用了lock,這個時候才會等ThreadA退出Critical Section之後才讓ThreadB執行obj.ToString(),例如:

    lock(obj){
      string str = obj.ToString();
    }

     

    以上,純屬小弟個人愚見。

     

    • 已標示為解答 布利 2010年6月22日 上午 01:57
    2010年6月18日 上午 03:42
  • lock鎖定的是程式碼區塊,而不是物件。以下面的程式來看,大括號內是Critical Section,同時只會有一條執行緒在執行這個區塊的程式碼。

    lock(obj){
    
     //do something
    
    }
    
    

     

    所以當ThreadA正在上述區塊執行,而同時間有另一條ThreadB正在跑以下的程式碼,那麼是可以順利執行而不會被鎖定的。

    string str = obj.ToString();
    
    

     

    除非ThreadB也使用了lock,這個時候才會等ThreadA退出Critical Section之後才讓ThreadB執行obj.ToString(),例如:

    lock(obj){
    
     string str = obj.ToString();
    
    }
    
    

     

    以上,純屬小弟個人愚見。

     


    謝謝您的解釋

    所以  我用 lock(DT.Rows.SyncRoot)

    並不能鎖定  DT 這個 DataTable囉

    那有什麼方法  可以讓這個 DataTable 是 不會被同時存取  而造成資料不一致呢!?

    2010年6月18日 上午 09:12
  • 讀取、寫入DataTable物件的地方都有用lock應該就行了,所以你現在的寫法就可以囉

    2010年6月18日 上午 09:48