2012-03-01 2 views
0

다음과 같은 방법으로 작업 실행을 위해 멀티 코어 프로세서에 스레드를 배포하지만 Windows 작업 관리자에서는 하나의 특정 코어 만 사용하는 것으로 나타났습니다. 이 5 개의 스레드에 대해 병렬로 만드는 방법은 무엇입니까?ThreadPool의 C# 병렬 스레딩

private void ActivateProcess 
{ 
    ... 
    ThreadPool.QueueUserWorkItem(new WaitCallback(Worker1)); 
    ThreadPool.QueueUserWorkItem(new WaitCallback(Worker2)); 
    ThreadPool.QueueUserWorkItem(new WaitCallback(Worker3)); 
    ThreadPool.QueueUserWorkItem(new WaitCallback(Worker4)); 
    ThreadPool.QueueUserWorkItem(new WaitCallback(Worker5)); 
} 

... 

private void Worker1(Object stateInfo) 
{ 
    try 
    { 
     //for (int i = 0; i < _NumberOfLoop; i++) 
     Parallel.For(0,(long)_NumberOfLoop, i => 
     { 
      if (_ForceToStop) 
       throw new System.ArgumentException(
        "Force stop at WorkerThread 1", "Aborted"); 

      // Process: Process a tasks 
      ... 
     }); 

    } 
    catch (Exception ex) 
    { 
     ... 
    } 
} 
+0

여기에 http://stackoverflow.com/questions/1718465/optimal-number-of-threads-per-core라고 가정하면 대답을 찾을 수 있습니다. –

+0

첫 번째 간단한 점검 - 작업 관리자에서 번호를 볼 수있는 스레드 수는 어느 정도입니까? 코어에 스레드를 배포하는 것은 응용 프로그램이 아니라 OS의 일부입니다. – weismat

+0

왜 스레드 풀에서 이미 실행중인 코드에서'Parallel.For'를 사용하고 있습니까? – Tudor

답변

1

이 코드에서 말하기 힘듭니다. 심지어 병렬 처리가 2 계층이므로 "작동해야합니다".

대답은 // Process: Process a tasks이어야하며 공유되지 않는 일반적인 리소스에 멈춰있을 것입니다.

'작업'의 코드가 독립적이고 CPU 집약적 인 경우 모든 코어가 사용 중인지 확인해야합니다. 하지만 예를 들어 Sleep()을 사용하여 조롱하려고하면 TaskManager에서 아무 것도 나타나지 않습니다.

+0

방금 ​​작업을 사용하려고 나를 공격했습니다. 나는 그것을 시도 할 것이다. 나는 나중에 나의 결과를 나눌 것이다. 고맙습니다. – Fusionmate