2011-08-10 5 views
1

다중 스레드 응용 프로그램에 대한 많은 다른 질문을 읽었으며 그 사이에서 작업을 분할하는 방법에 대해 많은 질문을 읽었지 만 실제로 필요한 것은 없습니다. 내 프로그램이 현재 기본적으로 작동하는 방법은 다음과 같습니다.다중 스레드로 작업 나누기

이것은 실제로 코드에서 실제로 발생하는 것의 대략적인 개요입니다.

내 문제는 여러 스레드가 Main2()를 실행하기 시작하면 다른 스레드와 동일한 X 값을 처리한다는 것입니다. main2 내부의 루프는 밀리 초당 여러 번 실행되므로 루프를 비틀어 쓸 수는 없습니다. 종종 작업의 중복이 이루어집니다.

어떻게 동시에 실행되는 두 스레드가 같은 작업을 실행하지 않도록 작업을 올바르게 나눌 수 있습니까?

+0

@Hossein : 코드 없음이 질문 페이지의 외부에서 온라인으로 발견하여 내 문제를 해결할 수있었습니다. 그렇습니다. – Cyclone

+0

@Hossein : 그리고 이것들은 어떤 책일까요? 아래에서 볼 수 있듯이 이미 문제가 해결되었으므로 여기서 질문하는 것이 잘못되어있는 것은 볼 수 없습니다. – Cyclone

+1

VB.NET을 배우는 방법, Jafar Nezhad Ghomi 교수님, 아마존 서점에서 찾을 수 있다고 생각합니다 :) 아마도이 저자의 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. 할당 작업 관리자에 10 개 쓰레드를 생성
  2. 관리자를 시작
  3. 관리자가 수행하는 작업 항목을 할당 (의 그것 10000 개 작업 항목을 큐 가정 해 봅시다, 작업을 대기열) 10 개의 각 스레드.
  4. 스레드가 자신의 작업을 끝내면 완료된 관리자에게 다시보고하고 다른 작업 항목을받습니다. 작업 대기열은 항목을 대기열에 포함하거나 대기열에서 제외시킬 수 있도록 스레드 안전해야합니다. 관리자는 작업 항목 관리를 처리합니다. 스레드가 작업을 실행합니다.

이 작업이 완료되면 작업 항목이 스레드간에 복제되어서는 안됩니다.

1

잠금 장치를 사용하면 한 번에 하나의 스레드 만 X에 액세스 할 수 있습니다. 한 스레드가 완료되면 다른 스레드가이를 사용할 수 있습니다. 그러면 두 개의 스레드가 동일한 값을 가진 nextvalue (x)를 호출하지 못하게됩니다.

+0

자물쇠는 어떻게 사용합니까? – Cyclone

+0

@Cyclone - 공유 클래스 멤버에서 SyncLock 문을 사용합니다. 아래의 Brian Gideon의 예를 참조하십시오. – rskar

+0

또는 System.Threading.Monitor 클래스에서 읽습니다. – rskar