要件:-任意の時点で、4 つのスレッドだけが 4 つの異なる関数を呼び出す必要があります。これらのスレッドが完了するとすぐに、次に利用可能なスレッドが同じ関数を呼び出す必要があります。
現在のコード:-これは、このようなことを達成するための最悪の方法のようです。While(True) は不必要な CPU スパイクを引き起こし、次のコードを実行すると CPU が 70% に上昇することがわかりました。
質問 :- AutoResetEventHandler を使用してメイン スレッドの Process() 関数にシグナルを送信し、最初の 4 つのワーカー スレッドの処理が完了したら、CPU サイクルを無駄にすることなく次の 4 つのスレッドを再度開始するにはどうすればよいですか。提案してください
public class Demo
{
object protect = new object();
private int counter;
public void Process()
{
int maxthread = 4;
while (true)
{
if (counter <= maxthread)
{
counter++;
Thread t = new Thread(new ThreadStart(DoSomething));
t.Start();
}
}
}
private void DoSomething()
{
try
{
Thread.Sleep(50000); //simulate long running process
}
finally
{
lock (protect)
{
counter--;
}
}
}