ホームページ バックエンド開発 C#.Net チュートリアル C# がスレッドプール機能を単体で実装する (2)

C# がスレッドプール機能を単体で実装する (2)

Dec 27, 2016 pm 02:37 PM

はじめに

前回の記事「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;
ログイン後にコピー

<喎�"/ kf/ware/vc/ " target="_blank" class="keylink">vcD4KPGgxPre9t6i2/jwvaDE+Cs7Sw8eyu8rH08PQxbrFwb+jrM7Sw8fKudPDQXV0b1Jlc2V0RXZlbnTAtMq1z9bNrLK9Cjxicj4KCrXa0ruyvaOs1N pUaHJlYWRQb2 9sTWFuYWdlcrP1yry7r8qxuvK0tL2o0ru49iAgbG9ja3MgPSBuZXcgQXV0b1 Jlc2V0RXZlbnQoZmFsc2UpOwq1sUFkZFRhc2u1xMqxuvJsb2Nrcy5TZXQoKTvNqNqtci0/b XEstnX96GjCsi7uvPO0s PHttRXb3JrVGhyZWFktcRydW66r8r91/bSu7j20KHQobXE0N64xAo8cHJlIGNsYXNzPQ=="brush:java;"> public void run() { while (flag && TaskQueue != null) { //タスクを待機中//ThreadPoolManager.sep.WaitOne(); //タスクを待機中 (TaskQueue.Count == 0 && flag) { try { ThreadPoolManager.locks.WaitOne() }; { } } //タスクロックを取得します (TaskQueue) { try { task = TaskQueue.Dequeue(); } catch (Exception) { task = null } if (task == null) continue { task.SetEnd( false) ); task.StartTask(); } catch (例外) { } try { if (!task.IsEnd()) { task.EndTask(); } } / /end of while }タスクリストの数が0の場合のみ、AddTaskまでブロックして続行します


上記は、C#のスレッドプール関数の独自実装(2)の内容です。 PHP 中国語ネット (www.php.cn) へ!


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C# を使用した Active Directory C# を使用した Active Directory Sep 03, 2024 pm 03:33 PM

C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# のアクセス修飾子 C# のアクセス修飾子 Sep 03, 2024 pm 03:24 PM

C# のアクセス修飾子のガイド。 C# のアクセス修飾子の種類について、例と出力とともに説明しました。

C# の乱数ジェネレーター C# の乱数ジェネレーター Sep 03, 2024 pm 03:34 PM

C# の乱数ジェネレーターのガイド。ここでは、乱数ジェネレーターの仕組み、擬似乱数の概念、安全な数値について説明します。

C# データ グリッド ビュー C# データ グリッド ビュー Sep 03, 2024 pm 03:32 PM

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

C# のパターン C# のパターン Sep 03, 2024 pm 03:33 PM

C# のパターンのガイド。ここでは、C# のパターンの概要と上位 3 種類について、その例とコード実装とともに説明します。

C# シリアル化 C# シリアル化 Sep 03, 2024 pm 03:30 PM

C# シリアル化のガイド。ここでは、C# シリアル化オブジェクトの導入、手順、作業、例についてそれぞれ説明します。

C# 文字列ライター C# 文字列ライター Sep 03, 2024 pm 03:23 PM

C# StringWriter のガイド。ここでは、C# StringWriter クラスの概要とその動作について、さまざまな例やコードとともに説明します。

C# での Web サービス C# での Web サービス Sep 03, 2024 pm 03:32 PM

C# での Web サービスのガイド。ここでは、C# での Web サービスの概要について、テクノロジの使用、制限、例を交えて説明します。

See all articles