2010-02-05 4 views
1

ThreadPool과 함께 사용하여 병렬 처리에서 사용하는 다중 프로세서 객체가 있습니다. 어떤 프로세서를 사용할지는 기본적으로 들어오는 데이터에 따라 다르며 2000 가지 이상의 다른 유형이있을 수 있습니다. 그래서 내 응용 프로그램을 실행하자마자 사전에 1-2K 개의 프로세서를 만들고 ThreadPool에 들어오는 데이터에 따라 필요한만큼 실행합니다. 모든 프로세스에는 밀리 초 btw 이상 소요되지 않습니다.ThreadPool을 사용한 객체 동기화

ThreadPool이 실행에 대한 나의 사이비 코드는 다음과 같습니다 :

public void onIncomingNewData(rawData) 
{ 
    if (!ThreadPool.QueueUserWorkItem(processors[rawData.Type.Id].Process, rawData)) 
    { 
     Console.WriteLine("Work item cannot be queued!"); 
     } 

     //Thread.Sleep(1); 
} 

여기 Processer 객체를 synchrnozing되어 내 문제; 그들은 내부 캐시를 가지고 있고, 같은 스레드 프로세스 프로세스 메소드를 실행하는 다중 스레드를 원하지 않습니다.

현재 프로세스 메서드 및 메서드 호출을 처리하는 다른 개인 메서드 내에서 "잠금"을 사용하고 있습니다. 그러나 이것을 수행하는 최선의 방법은 무엇입니까?

+0

"동기화"의 의미에 따라 다릅니다. 이 동기화의 목표는 무엇입니까? – Will

답변

1

기본적으로 필요한 것은 유형에 따른 프로세서 풀입니다. 프로세서 사전에 실제 프로세서를 캐시하는 대신 사용 가능한 활성 프로세서를 추적하는 풀 클래스를 만듭니다. 요청이 들어 오면 적절한 풀을 찾으십시오. 그런 다음 사용 가능한 프로세서가 있는지 확인하십시오. 그렇다면 사용 가능한 목록에서 꺼내 활성 목록에 넣습니다. Process 메서드를 실행 한 다음 활성 목록에서 다시 가져 와서 사용 가능한 목록에 넣습니다.

활성/사용 가능 목록을 사용하지 않고 대신 활성 플래그 만 사용하면 문제를 해결할 수 있습니다. 동시 프로세스 수에 따라 더 효율적일 수 있습니다.

그러나 각 프로세스 호출이 단지 밀리 초가 걸린다면, 이것은 당신의 특별한 필요에 따라 과도한 소리가 난 것처럼 들립니다. 동기화를 위해 lock()을 사용하고 프로세스가 잠금 대기 시간을 확인하기 위해 일부 로깅을 추가하는 것이 좋습니다. 테스트에서 문제가된다면, 좀 더 복잡한 것으로 진행하십시오.

이미 스레드 세이프가 아니면 processors 사전에 대한 액세스를 잠글 필요가있을 수도 있습니다. 사전이 100 % 사전로드 된 경우 필요하지 않을 수 있습니다.

+0

동의 - 이것은 최근 Copsey가 최근에 블로그에 쓴 문제와 비슷합니다 (http://reedcopsey.com/2009/11/12/thread-specific-data-becomes-easier-in-net-4-0-via에서). -threadlocalt /). 그의 대답은 .NET 4.0에서 사용할 수있는 인스턴스 수준의 스레드 로컬 저장소를 사용하는 것이 었습니다. 아직 4.0을 사용하고 있지 않다면 아마도 풀이 가장 좋은 해결책 일 것입니다. Reed가 발견 한 것처럼 공유 프로세스 데이터를 잠그면 특히 빠른 작업을 위해 병렬 처리를 통해 얻을 수있는 성능 향상을 취소 할 수 있습니다. –

0

스레드 풀에 프로세서 메서드를 주입하는 대신 각 프로세서가 자체 큐 큐를 유지하고 자체 작업자 메서드를 스레드 풀에 주입하도록하십시오.

관련 문제