2012-09-26 133 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)调用时,该程序按预期工作。

相关问题