有人可以幫助我理解synclock語句的工作原理嗎?我知道還有一些關於synclock的帖子,但我無法很好地回答這些問題。我正試圖讓一個簡單的多線程示例啓動並運行,但遇到了麻煩。起初我嘗試了下面的代碼。我應該使用SyncLock還是Interlocked?
Public Class Class1
Public list As List(Of Integer) = New List(Of Integer)
Public Sub addInt(ByVal i As Integer)
SyncLock list
list.Add(i)
End SyncLock
End Sub
Public Sub MainLoop()
While list.Count < 50
SyncLock list
For Each i As Integer In list
Debug.WriteLine(i.ToString())
Next
End SyncLock
End While
End Sub
End Class
我有一個簡單的winform有兩個按鈕。我使用第一個按鈕來創建Class 1的obj,並在新線程中啓動MainLoop方法。我使用輔助按鈕來調用addInt方法。但是,代碼可能適用於一兩個或兩個,然後鎖定。在閱讀了這個表單中的其他問題之後,我意識到synclock語句的lockobject沒有像我最初想象的那樣工作,並且只是一個不應該改變的任意引用對象。我認爲syncLock語句只是在將處理器控制權交給新線程之前強制執行整個代碼塊。所以我嘗試使用另一個鎖對象,但現在它只是鎖定。
Public Class Class1
Private padLock As String = "PADLOCK"
Public list As List(Of Integer) = New List(Of Integer)
Public Sub addInt(ByVal i As Integer)
SyncLock padLock
list.Add(i)
End SyncLock
End Sub
Public Sub MainLoop()
While list.Count < 50
SyncLock padLock
For Each i As Integer In list
Debug.WriteLine(i.ToString())
Next
End SyncLock
End While
End Sub
End Class
有人可以解釋爲什麼上述代碼不起作用嗎?在一篇類似的文章中,有人提到Interlocked類會很有用,但我無法弄清楚那是什麼或者如何使用它。一個簡短的「傻瓜互鎖類」的解釋也將不勝感激。
如果'Count'永遠不會改變,那麼它就可以永遠做到這一點,實質上_looking_爲所有實際目的確實已鎖定。我沒有看到'addInt'在任何地方使用。 –
當我按下winform上的第二個按鈕時,使用AddInt。有關詳細信息,請參閱第一個代碼塊後面的段落。 –
聯鎖將*不*在這裏有所幫助。沒有明顯的原因,爲什麼這個代碼會死鎖,你需要發佈一個更好的例子。 –