有人可以帮助我理解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。有关详细信息,请参阅第一个代码块后面的段落。 –
联锁将*不*在这里有所帮助。没有明显的原因,为什么这个代码会死锁,你需要发布一个更好的例子。 –