2010-11-24 17 views
2

私は以下の構造の単純なマルチスレッドプログラムを持っています。Cでの同時スレッド数を制御する最良の方法#

public void someFunction() 
{ 

    List<object> objList = new List<object>(); 
    //objList populated here 

    foreach(object o in objList) 
    { 
     Thread aThread = new Thread (new ParameterizedThreadStart(doSomething)); 
     aThread.Start(o); 
    } 
} 

static void doSomething(object o) 
{ 
    //Do something with o. 
} 

これはうまくいきますが、同時に実行されるtheadsの数を制限する問題があります。例えば、int maxThreads = 25を定義したいとします。私はより良い方法があり、これはそれについて移動するための正しい方法ではありません確信している

SomeThreadsafeCounter c = new SomeThreadsafeCounter(); 

foreach(object o in objList) 
{ 
    while (c < 26){ wait; } 
    c++; 
    Thread aThread = new Thread (new ParameterizedThreadStart(doSomething)); 
    aThread.Start(o); 
    c--; 
} 

:私はそれをやって考えることができる最高の方法は、のようなものでしょうか?

+0

doSomethingがかなり重い作業をしていない限り、呼び出しごとに新しいスレッドを作成するのに多くの時間を費やすことになります。 –

答えて

1

は4

ParallelOptions options = new ParallelOptions(); 
options.MaxDegreeOfParallelism = 25; 

Parallel.ForEach(objList, options, item => doSomething(item)); 

Parallel.ForEachが過負荷の数を持っており、私はここに正しいものを持っていることを確認していない.NETに含まれています。ここ

さらに詳しい情報:http://msdn.microsoft.com/en-us/library/dd537608.aspx

1

.net 2.0以降を使用している場合は、セマフォを使用できます。

セマフォは、スレッド数がセマフォオブジェクトの指定された制限よりも大きい場合に、セマフォオブジェクトを解放して待機スレッドを入力できるようにします。あなたは、タスク並列ライブラリでこれを行うことができます

1

あなたが前に4.0に.NETを使用している場合は、マルチスレッド生産者、消費者のキューを作成する必要があります。コンストラクタでは、ワーカースレッドの制限を指定できます。このようにすることのメリットは、ワーカースレッドの作成とスレッドの同期を実際の関数コードから分離できることです。 WebとStackOverflowには多くの例があります。

.net 4.0を使用している場合は、明らかに、あなたが見ることのできるSystem.Collections.Concurrent型と前述のParallel型があります。

関連する問題