有人能帮我理解一下synclock语句是如何工作的吗?我知道这里还有其他一些关于synclock的帖子,但我不能很好地理解这些答案。我试图让一个简单的多线程示例启动并运行,但遇到了问题。首先,我尝试了以下代码。
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。我使用第一个按钮创建了Class1的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有人能解释一下为什么上面的代码不能工作吗?在类似的帖子中,有人提到互锁类会很有用,但我不知道它是什么,也不知道它是如何使用的。一个简短的“互锁类的哑巴”的解释也将不胜感激。
发布于 2012-09-27 01:14:07
好了,我想我找到问题所在了。我不认为我的线程死锁了,我认为它只是耗尽了我的Application.Run()线程的资源。当我在MainLoop方法中的End SyncLock之后添加一个Thread.Sleep(500)调用时,程序按预期工作。
https://stackoverflow.com/questions/12604136
复制相似问题