C# lock整理

  • 16260
  • 0
  • C#
  • 2010-12-09

摘要:C# lock整理

之前使用lock來控制物件的存取發生了點問題,

後來查文章發現自己對lock有些不正確的認知,

整理一下lock的特性。

  • lock的目標並不是物件,而是程式碼區段,只有被lock包覆的程式區段才會有作用。
  • 當使用lock(xxx)時,xxx可以想象成是一個識別號,所有相同識別號的lock程式區段,會受到lock的影響。
  • lock並不能使用struct來當作識別號。
  • 當有資料要作存取的控制時,把這些要控制的資料包裝起來,然後提供方法來存取,並且用lock(this)來控制是不錯的作法。

當需要做多執行緒的資源存取控制的程式碼的時候,感覺是一個相當具挑戰性的工作,以自己的能力,把這項工作做好並不容易,之前所發生的問題,最後也並沒有得到解決,最後的處理方式是改用別的方法來避開,以當時的狀況而言,這是最佳的做法,不過,萬一必須得面對這狀況的時候,一定會花掉相當的時間去修改程式、測試程式,將這些整理起來,如果下次再遇到相同的問題,可以用來參考。

 

關於lock(this)會發生Deadlock的一些文章:

http://haacked.com/archive/2005/04/12/neverlockthis.aspx

http://haacked.com/archive/2006/08/08/threadingneverlockthisredux.aspx

 建議的作法是在類別內宣告一個私有物件,然後以其作為lock的instance,

class MyClass

{

    private object m_LockFlag = new object();

    public void Method()

    {

        lock(m_LockFlag)

        {

            .............

        }

    }
}