2012-09-26 163 views
0

有人可以幫助我理解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類會很有用,但我無法弄清楚那是什麼或者如何使用它。一個簡短的「傻瓜互鎖類」的解釋也將不勝感激。

+0

如果'Count'永遠不會改變,那麼它就可以永遠做到這一點,實質上_looking_爲所有實際目的確實已鎖定。我沒有看到'addInt'在任何地方使用。 –

+0

當我按下winform上的第二個按鈕時,使用AddInt。有關詳細信息,請參閱第一個代碼塊後面的段落。 –

+0

聯鎖將*不*在這裏有所幫助。沒有明顯的原因,爲什麼這個代碼會死鎖,你需要發佈一個更好的例子。 –

回答

0

好吧我想我找到了問題所在。我不認爲我的線程是死鎖,我認爲它只是捱餓我的Application.Run()線程資源。當我在MainLoop方法中的End SyncLock之後添加Thread.Sleep(500)調用時,該程序按預期工作。

相關問題