关于多线程应用程序以及如何在它们之间进行分解,我已经阅读了很多关于SO的不同问题,但似乎没有一个真正符合我的需要。以下是我的程序目前的基本工作方式:
Module Module1
'string X declared out here
Sub Main()
'Start given number of threads of Main2()
End Sub
Sub Main2()
'Loops forever
'Call X = nextvalue(X), display info as needed
End Sub
Function nextvalue(byval Y as string)
'Determines the next Y in the sequence
End Function
End Module
顺便提一下,这只是我代码中实际发生的事情的大致轮廓。
我的问题是,如果多个线程开始运行Main2(),它们将处理与其他线程中相同的X
值。 main2内部的循环每毫秒执行多次,所以我不能错开循环。通常会重复工作。
如何正确分割工作,以便同时运行的两个线程永远不会运行相同的工作?
答案 0 :(得分:2)
您应该同步X
的生成和存储,以便复合操作对所有线程都是原子的。
Module Module1
Private X As String
Private LockObj As Object = New Object()
Private Sub Main2()
Do While True
' This will be used to store a snapshot of X that can be used safely by the current thread.
Dim copy As String
' Generate and store the next value atomically.
SyncLock LockObj
X = nextValue(X)
copy = X
End SyncLock
' Now you can perform operations against the local copy.
' Do not access X outside of the lock above.
Console.WriteLine(copy)
Loop
End Sub
End Module
答案 1 :(得分:1)
线程管理器需要管理线程及其执行的工作。假设将工作分成10个线程是可取的。
一旦到位,工作项就不应该在线程中重复。
答案 2 :(得分:1)
使用锁定,以便一次只能有一个线程访问X.一旦完成一个线程,另一个线程就可以使用它。这将阻止两个线程使用相同的值调用nextvalue(x)。