0

誰かが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

2つのボタンがある単純なWinFormがありました。最初のボタンを使用してClass1のobjを作成し、新しいスレッドでMainLoopメソッドを開始しました。そして、2番目のボタンを使用してaddIntメソッドを呼び出しました。ただし、コードは1、2回押すと機能し、その後ロックされる可能性があります。このフォームから他の質問を読んだ後、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 に答える