将工作分成多个线程

时间:2011-08-10 19:08:27

标签: vb.net multithreading

关于多线程应用程序以及如何在它们之间进行分解,我已经阅读了很多关于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内部的循环每毫秒执行多次,所以我不能错开循环。通常会重复工作。

如何正确分割工作,以便同时运行的两个线程永远不会运行相同的工作?

3 个答案:

答案 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个线程是可取的。

  1. 启动经理
  2. 经理创建10个帖子
  3. 将工作分配给经理(排队工作,假设它排队了10000个工作项)
  4. 经理为10个主题中的每个主题分配一个工作项。
  5. 当线程完成他们的工作时,他们向经理报告他们已完成并收到另一个工作项目。工作队列应该是线程安全的,以便项目可以入队和出队。经理处理工作项的管理。线程只是执行工作。
  6. 一旦到位,工作项就不应该在线程中重复。

答案 2 :(得分:1)

使用锁定,以便一次只能有一个线程访问X.一旦完成一个线程,另一个线程就可以使用它。这将阻止两个线程使用相同的值调用nextvalue(x)。