我应该使用SyncLock还是Interlocked?

时间:2012-09-26 14:34:28

标签: 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
            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语句的锁定对象不能像我最初想的那样工作,并且只是一个不应该被改变的任意引用对象。我认为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类很有用,但我无法弄清楚它是什么或者如何使用它。还将赞赏一个简短的“互锁傻瓜类”解释。

1 个答案:

答案 0 :(得分:0)

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