0

有人可以帮我理解同步锁语句是如何工作的吗?我知道这里还有其他一些关于同步锁的帖子,但我无法很好地理解答案。我正在尝试启动并运行一个简单的多线程示例,但遇到了麻烦。起初我尝试了以下代码。

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

有人可以解释为什么上面的代码不起作用吗?在类似的帖子中,有人提到 Interlocked 类会很有用,但我不知道它是什么或如何使用它。一个简短的“傻瓜互锁类”解释也将不胜感激。

4

1 回答 1

0

好的,我想我找到了问题所在。我不认为我的线程死锁了我认为它只是让我的 Application.Run() 线程资源匮乏。当我在 MainLoop 方法中的 End SyncLock 之后添加 Thread.Sleep(500) 调用时,程序按预期工作。

于 2012-09-26T17:14:06.913 回答