Przede wszystkim nikt nie możne zagwarantować, że stworzenie nowych wątków przyspieszy pracę(w tym wypadku na pewno nie) - niektórych problemów nie da się "zrównoleglić"(np. gdy wynik kolejnej iteracji jest ściśle zależny od poprzedniej). Nikt nie może zagwarantować, że wątek 2(i następne) w ogóle zdąży coś zrobić, ani że zachowana będzie kolejność(w konsoli możesz dostać np. 1, 2, 3, 5, 6, 4, 7, chyba że zaprojektujesz aplikację tak, aby kolejność była zachowana, ale to zazwyczaj bez sensu).
Żeby 2 wątki się wzajemnie wspomagały, muszą robić to samo, na tych samych danych, więc zmienna zua musi być współdzielona. Gdy więcej niż 1 wątek ma dostęp do jakiejś danej(i nie jest ona tylko do odczytu), konieczna jest synchronizacja. Istnieją różne metody synchronizacji, w zależności od problemu jaki jest do rozwiązania.
Nie bijcie, nie używałem VB już dawno ;P
Module Module1
'do synchronizacji, wszystkie zmienne jako pola klasy, a nie zmienne wewnątrz funkcji/metody(no może poza delay)
Dim obj As New Object
Dim delay As Integer
Dim luba As Integer
Dim zua As Integer
Dim die As Boolean
Dim delay2 As Integer
Dim rand As New Random
Sub Main()
luba = 0
zua = 0
delay = 500
die = False
Dim thread As System.Threading.Thread
thread = New System.Threading.Thread(AddressOf pls2)
thread.IsBackground = True
thread.Name = "Thread 1"
Dim thread2 As System.Threading.Thread
thread2 = New System.Threading.Thread(AddressOf pls2)
thread2.IsBackground = True
thread2.Name = "Thread 2"
zua = luba
thread.Start()
System.Threading.Thread.Sleep(delay)
thread2.Start()
Console.ReadLine()
End Sub
Private Sub pls()
While Not die
SyncLock (obj)
'Używaj liczby większych niż 10, bo to się wykona zanim drugi wątek w ogóle powstanie
If zua > 10000 Then
die = True
Else
Console.WriteLine("{0} {1}", zua.ToString, Threading.Thread.CurrentThread.Name)
zua += 1
End If
End SyncLock
End While
End Sub
Private Sub pls2()
Dim localTmp As Integer
While Not die
SyncLock (obj)
'Używaj liczby większych niż 10, bo to się wykona zanim drugi wątek w ogóle powstanie
If zua > 10000 Then
die = True
Else
localTmp = zua
zua += 1
End If
End SyncLock
If Not die Then
Console.WriteLine("{0} {1}", localTmp .ToString, Threading.Thread.CurrentThread.Name)
End If
End While
End Sub
End Module
U mnie pls dawało zazwyczaj kilka razy pod rząd Thread 1, potem kilka razy Thread 2(a propos podziału pracy), natomiast jeśli wątki wywołasz z pls2 to zobaczysz, o co mi z kolejnością chodziło.