はじめに
前回の記事「C#でスレッドプール機能を実装する(1)」では、基本的に実行できるプログラムを実装しましたが、実際にはスレッドプールとは言えません。前回の記事のコードには致命的なバグがあり、タスクがない場合は待機せずに、狂ったように while ループが実行され、タスク リストをロックしようとします。パフォーマンスが非常に低く、プログラムの応答速度が非常に遅い (新しいタスクが追加されると、ジョブの実行が開始されるまでに時間がかかる) のは、先ほど述べたとおりです。
この問題を解決するには、何らかの方法を使用してプログラムがプロセスを同期できるようにする必要があります。
方法 1
セマフォを使用する
タスクのロック操作を減らすために、タスクが空でない場合にのみテストします。セマフォはタスク テーブル内の番号を表します。 s.WaitOne(); が成功すると、タスクのロックと取り出しが開始されます
while (flag && TaskQueue != null) { //等待任务 ThreadPoolManager.s.WaitOne(); //获取任务 lock (TaskQueue) { try { if (TaskQueue.Count > 0) task = TaskQueue.Dequeue(); else task = null; } catch (Exception) { task = null; } if (task == null) continue;
ThreadPoolManager クラスに 2 つの変数を追加し、セマフォ s = を初期化します。このクラスを初期化するときに new Semaphore(0, MaxJobNum);
この方法で同期を実現できます
テストクラスを以下に示します
//由于采用信号量需要定义一个 public int MaxJobNum = 1000; public static Semaphore s;
上記は、C#のスレッドプール関数の独自実装(2)の内容です。 PHP 中国語ネット (www.php.cn) へ!