2011-08-10 6 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の内部のループはミリ秒ごとに複数回実行されるので、ループをずらすことはできません。多くの場合、作業の重複が行われます。

同時に実行している2つのスレッドが同じ作業を実行することがないように、作業を適切に分割するにはどうすればよいですか?

+0

@ホセイン:いいえコード私はこの質問のページ外でこのオンラインで見つかったので、私の問題を解決することができました。 – 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. Managerがために完了するために、作業項目を割り当て各10スレッド。
  5. スレッドが作業を終了すると、スレッドは完了したことをマネージャに報告し、別の作業項目を受け取ります。作業の待ち行列は、項目が待ち行列に入れられ、待ち行列から取り出されるようにスレッドセーフでなければなりません。マネージャは作業項目の管理を行います。スレッドは作業を実行するだけです。

これが実行されると、作業項目がスレッド間で重複してはなりません。

1

ロックを使用すると、一度に1つのスレッドだけがXにアクセスできます。 1つのスレッドが終了すると、別のスレッドがそのスレッドを使用することができます。これにより、2つのスレッドが同じ値を持つnextvalue(x)を呼び出すのを防ぎます。

+0

ロックを使用するにはどうすればよいですか? – Cyclone

+0

@Cyclone - 共有クラスメンバーでSyncLockステートメントを使用します(下のBrian Gideonの例を参照)。 – rskar

+0

また、System.Threading.Monitorクラスを読み上げてください。 – rskar

関連する問題