2012-03-01 24 views
0

以下の方法では、タスクを実行するためにスレッドをマルチコアプロセッサに配布していますが、Windowsタスクマネージャでは特定のコアのみを使用していました。それら5つのスレッドのためにそれを並列にする方法は?ThreadPoolでの並列スレッド化

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

関連する問題