2011-12-05 20 views
2

は:並列プログラミングTPL

for (int i = 0; i < 1000000; i++) { 
     // create a new task 
     tasks[i] = new Task<int>((stateObject) => { 
      tls.Value = (int)stateObject; 

       for (int j = 0; j < 1000; j++) { 
       // update the TLS balance 
       tls.Value++; 
       } 

      return tls.Value; 
      }, account.Balance); 

     tasks[i].Start(); 
} 

これらのタスクは、基本的にProcessThread上で動作しています。したがって、1,000,000回のタスクに対して1プロセススレッドを1,000,000回スライスすることができます。

TPLタスクスケジューラは、OSを見て、マルチコアマシンに8つの仮想プロセススレッドがあることを確認し、これらの8つの仮想プロセススレッドに1,000,000タスクの負荷を割り当てますか?

+0

構文についてはわかりませんが、ロジックが正しいようです。私はparallel.forをお勧めします – Bengie

答えて

6

Nowsタスクは基本的にProcessThreadで動作します。したがって、1000000個のタスクに対して1プロセススレッドを1000000回スライスできます。

これは当てはまりません。 A Task!=スレッドであり、特にProcessThreadとは一致しません。複数のタスクが1つのスレッドにスケジューリングされます。

OSを調べ、マルチコアマシンに8つの仮想プロセススレッドがあると判断するので、これら8つの仮想プロセススレッドに1000000タスクの負荷を割り当てますか?

効果的です。上記のTaskSchedulerを使用する場合、タスクはThreadPoolスレッド上で実行されます。つまり、データの並列処理(巨大なforループでのループなど)は、通常はParallel.Forで処理する方がはるかに優れています。またはParallel.ForEach。 Parallelクラスは内部的にPartitioner<T>を使用して作業をより少ないタスクに分割します。これによりオーバーヘッドが大幅に軽減されるため全体的なパフォーマンスが向上します。詳細は、Partitioning in the TPLの投稿を参照してください。

1

大まかに、あなたの現在のコードはThreadPoolで1000000個のタスクをプッシュします。それらのタスクがかなりの時間を取ると、問題に遭遇する可能性があります。このような状況では

は、常に

Parallel.For(0, 1000000, ...); 

を使用して、あなたは、スケジューラを持っていないだけでなく、負荷を分散するためにあなたを助けパーティもより重要。
これははるかに読みやすいです。

関連する問題