Vb.net 我应该使用SyncLock还是Interlocked?
有人能帮我理解synclock语句是如何工作的吗?我知道这里还有一些关于synclock的帖子,但我没能很好地理解这些答案。我正在尝试启动并运行一个简单的多线程示例,但遇到了问题。首先,我尝试了以下代码Vb.net 我应该使用SyncLock还是Interlocked?,vb.net,multithreading,asynchronous,synchronization,synclock,Vb.net,Multithreading,Asynchronous,Synchronization,Synclock,有人能帮我理解synclock语句是如何工作的吗?我知道这里还有一些关于synclock的帖子,但我没能很好地理解这些答案。我正在尝试启动并运行一个简单的多线程示例,但遇到了问题。首先,我尝试了以下代码 Public Class Class1 Public list As List(Of Integer) = New List(Of Integer) Public Sub addInt(ByVal i As Integer) SyncLock list
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
公共类1
作为列表的公共列表(整数)=新列表(整数)
公共子加法器(ByVal i作为整数)
同步锁列表
列表.添加(i)
端同步
端接头
公共子主循环()
而列表。计数<50
同步锁列表
对于列表中作为整数的每个i
Debug.WriteLine(i.ToString())
下一个
端同步
结束时
端接头
末级
我有一个简单的winform,有两个按钮。我使用第一个按钮创建一个Class1的obj,并在一个新线程中启动MainLoop方法。我使用seconded按钮调用addInt方法。但是,该代码可能会在按下一两下后锁定。在阅读了表单中的其他问题后,我意识到synclock语句的lock对象并没有像我最初认为的那样工作,它只是一个不应该更改的任意引用对象。我认为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
公共类1
私有挂锁为String=“挂锁”
作为列表的公共列表(整数)=新列表(整数)
公共子加法器(ByVal i作为整数)
同步锁挂锁
列表.添加(i)
端同步
端接头
公共子主循环()
而列表。计数<50
同步锁挂锁
对于列表中作为整数的每个i
Debug.WriteLine(i.ToString())
下一个
端同步
结束时
端接头
末级
有人能解释一下为什么上面的代码不起作用吗?在一篇类似的帖子中,有人提到Interlocked类会很有用,但我不知道它是什么,也不知道它是如何使用的。一个简短的“傻瓜联锁类”的解释也将不胜感激 好的,我想我解决了问题。我不认为我的线程是死锁的,我认为它只是让我的应用程序。Run()线程缺少资源。当我在MainLoop方法中的End SyncLock之后添加一个Thread.Sleep(500)调用时,程序按预期工作 如果Count永不改变,它可能永远在做这件事,本质上是寻找所有实际上已经锁定的实际用途。我看不到任何地方都使用了
addInt
。当我按下winform上的第二个按钮时,会使用addInt。有关更多信息,请参见第一段代码后的段落。联锁在这里没有帮助。没有明显的原因说明这段代码会死锁,您需要发布一个更好的示例。这段代码看起来不错。问题可能出在调用此函数的代码中。您能否将代码简化为再现问题的最小完整示例,并将所有代码一起发布?不要锁定字符串文字(就像锁定类型一样非常危险)。锁定新对象()
。