摘要: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)
{
.............
}
}
}