使用多线程两次选取值 [VB.NET]

问题描述 投票:0回答:1

我正在尝试在我的代码中应用一些多线程,因此我尝试练习一些简单的任务。 在下面的简单代码中,我希望每个线程获取计数器(m)的一个值,然后增加其值,然后使用先前获取的值进行一些操作,并将其结果复制到列表(listL)中。 不幸的是我无法阻止线程两次取相同的值...... 这可能是微不足道的,但我找不到合适的解决方案...... 预先感谢..

马里奥

imports System.Threading

Module Module1
    Public m As UShort = 0
    Dim listL As New List(Of Integer)

Sub Main()
    Dim t1 As New Thread(AddressOf TestMultiThreading)
    Dim t2 As New Thread(AddressOf TestMultiThreading)

    t1.Start("a")
    t2.Start("b")

    t1.Join()
    t2.Join()

    For m As Integer = 0 To listL.Count - 1
        For n As Integer = m + 1 To listL.Count - 1
            If listL(n) = listL(m) Then Debug.Print("same {0} {1}", n, m)
        Next n
    Next m

    listL.Clear()

End Sub

Public Sub TestMultiThreading(ByVal X As Char)
    Dim lobj1 As New Object
    Dim p As Integer

    Do While m < 100
        SyncLock lobj1
            p = m
            m += 1
        End SyncLock
        ' various calculations ...
        ' eventually
        listL.Add(m)
    Loop

    lobj1 = Nothing

    Debug.WriteLine("end " & X)

End Sub

End Module
vb.net multiprocessing
1个回答
0
投票

我创建了这个测试。看看差异,特别是锁对象如何在循环之外,并且值 p 被添加到列表中,而不是 m。

Module Module1
Public m As Integer = 0
Dim listL As New List(Of String)

Sub Main()
    Dim t1 As New Threading.Thread(AddressOf TestMultiThreading)
    Dim t2 As New Threading.Thread(AddressOf TestMultiThreading)

    t1.Start("a")
    t2.Start("b")
    Threading.Thread.Sleep(0)
    t1.Join()
    t2.Join()

    For xm As Integer = 0 To listL.Count - 1
        Debug.WriteLine(listL(xm))
        For n As Integer = xm + 1 To listL.Count - 1
            If listL(n) = listL(xm) Then
                Debug.Print("same {0} {1}", n, xm)
            End If
        Next n
    Next xm

    listL.Clear()
    Stop
End Sub

Dim lobj1 As New Object

Public Sub TestMultiThreading(ByVal X As Object)

    Dim p As Integer
    Dim c As String = DirectCast(X, String)
    Do While m < 100
        SyncLock lobj1
            p = m
            m += 1
        End SyncLock
        Threading.Thread.Sleep(0) ' various calculations ...
        ' eventually
        'listL.Add(p.ToString & c) 'for debug
        listL.Add(p.ToString)
    Loop


    Debug.WriteLine("end " & c)

End Sub

End Module
© www.soinside.com 2019 - 2024. All rights reserved.