2011-08-10 46 views
1

我已經閱讀了關於多線程應用程序以及如何拆分它們之間的工作的很多不同的問題,但是沒有一個真正適合我需要的東西。下面是我的計劃目前基本工作原理:將工作劃分爲多個線程

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

@Hossein:在這個問題頁面之外,我發現這個網上沒有代碼能夠解決我的問題,所以是的。 – Cyclone

+0

@侯賽因:這些會是什麼書?我已經解決了這個問題,如下所示,所以我沒有看到在這裏問什麼問題。 – Cyclone

+1

我想你可以參考如何學習VB .NET,Jafar Nezhad Ghomi教授,我認爲你可以在Amazon Book store中發現:)也許這位作者在VB .NET中的多線程是有用的。 –

回答

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

需要線程管理器來管理線程和他們所做的工作。說可以將工作分成10個線程。

  1. 開始
  2. Manager創建10個線程
  3. 工作分配給經理的經理(排隊的工作,讓我們說這排隊10000個工作項目)
  4. 經理分配一個工作項目,以完成10個線程中的每一個。
  5. 隨着線程完成他們的工作,他們會向經理報告他們已完成並接收其他工作項目。工作隊列應該是線程安全的,以便項目可以入隊和出隊。經理處理工作項目的管理。線程只是執行工作。

一旦這個到位,工作項目不應該在線程中重複。

1

使用鎖定,以便一次只有一個線程可以訪問X.一旦一個線程完成了,另一個線程就可以使用它。這將阻止兩個線程使用相同的值調用nextvalue(x)。

+0

如何使用鎖定? – Cyclone

+0

@Cyclone - 在共享類成員上使用SyncLock語句,請參閱下面的Brian Gideon示例。 – rskar

+0

或者,閱讀System.Threading.Monitor類。 – rskar