我正在尝试在我的代码中应用一些多线程,因此我尝试练习一些简单的任务。 在下面的简单代码中,我希望每个线程获取计数器(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
我创建了这个测试。看看差异,特别是锁对象如何在循环之外,并且值 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