1

Threadpool を使用して、c# .NET 2.0 で並列処理を行っています。

コード :

int MAXThreads=GetConfigValue("MaxThreadLimit"); //This value is read from app.config

ManualResetEvent[] doneEvents=new ManualResetEvent[MAXThreads];
for(int i=0;i<MaxThreads,i++)
{

doneEvents[i]=new ManualResetEvent(false);

//create workload
DoProcess job=new DoProcess(workload,doneEvents[i]);
ThreadPool.QueueUserWorkItem(job.ThreadPoolCallBack,i);

}
WaitHandle.WaitAll(doneEvents);

//proceed

Class DoProcess
{
private WorkLoad load;
private ManualResetEvent doneEvent;
public DoProcess(WorkLoad load,ManualResetEvent doneEvent)
{
this.load=load;
this.doneEvent=doneEvent;
}
public void ThreadPoolCallBack(object index)
{
//Do Processing
doneEvent.Set();
}
}

MAXThreads 値は構成から読み取られていますが、これは生成された実際のスレッド数とは関係がないと思います。すべてのワークロードを処理するスレッドはわずか 4 ~ 5 個です。スレッド数を 20 前後に固定したいのですが、どうすればこれを達成できますか? 何か不足していますか?..SetMaxThreads はこの問題に対処していますか?..上記のコードはクアッド コア CPU で実行されます。

4

3 に答える 3

3

代わりに、スレッドの最小数を設定する必要があります。

一般に、これはあまり良い考えではありません。プロセッサ コアよりも多くのスレッドを実行すると、オペレーティング システムがそれらのスワップ インとスワップ アウトに時間を費やしているため、通常は実行される作業が少なくなります。これらのコンテキスト スイッチは安価ではありません。スレッドプール マネージャーは、アクティブなスレッドの数をコアの数に制限するために最善を尽くします。既存のスレッドが時間内に完了しない場合にのみ、追加のスレッドの実行を許可します。スレッドの最大数まで。デフォルトでは非常に大きな値で、あなたの場合は 1000 です。

ワーカー スレッドが I/O で頻繁にブロックされて十分な作業を実行していない場合にのみ、最小スレッド数を増やします。その場合、スレッド プール スレッドの代わりに Thread オブジェクトを検討する必要があります。

于 2012-05-19T14:26:40.797 に答える
0

これが C# アプリケーションであると仮定すると、.NET Framework 4 の並列プログラミング モデルを使用して、スレッドを 20 に制限できます。

Parallel.For(0, n, new ParallelOptions { MaxDegreeOfParallelism = 20 }, 
  i => 
  { 
    DoWork(i);
  }); 

ただし、これが Web サイト/アプリである場合は、ThreadPool を枯渇させたくないため、1 ~ 2 スレッドの非常に小さなジョブを除いて、ThreadPool から離れることをお勧めします。また、コードで最大スレッドまたは最小スレッドを設定しないでください。これは、サイト全体と、同じスレッド プールを使用する他のすべてのサイトに影響するためです。

この場合、代わりにSmartThreadPoolを使用することをお勧めします。

于 2012-05-19T14:05:52.183 に答える
0

クラスSetMinThreadsにもあります。ThreadPool最小値と最大値の両方を同じ値に設定すると、スレッド数が修正されるはずですが、内部で実際に何が起こるかは誰にもわかりません。

MSDN :

スレッド プールは、各カテゴリの最小値に達するまで、オンデマンドで新しいワーカー スレッドまたは I/O 完了スレッドを提供します。

したがって、スレッドの最小数を 20 に設定すると、プール内のスレッドが 20 以上になるはずです。

于 2012-05-19T14:18:26.740 に答える