![]() |
連載.NETマルチスレッド・プログラミング入門第2回 .NETにおけるマルチスレッドの実装方法を総括高木 健一http://www.woodensoldier.info/ 2005/04/20 |
|
|
前回は、マルチスレッド・プログラミングの概念と仕組み、およびマルチスレッドによって得られるメリットについて解説した。今回は、具体的に.NETにおけるマルチスレッド・プログラミングの実装方法を紹介する。
.NETにおけるマルチスレッド・プログラミングの方法
.NETでは、マルチスレッドを実現する方法が複数用意されている。それぞれの方法の特徴を表にまとめてみた。まずはこの表に示した各方法の概要について簡単に触れた後、具体的な実装方法を解説していく。
| 方法 | メリット | デメリット |
| スレッド (Thread) |
・ 各スレッドに優先順位を設定できる ・ スレッドの一時停止/再開/中断を行うことができる |
・ スレッドの作成と破棄を繰り返すとパフォーマンスが落ちる ・ メソッドにパラメータを設定できない ・ メソッドの戻り値を得るのが困難 |
| スレッドプール (ThreadPool) |
・ 効率よく複数のスレッドを実行できる ・ object型のパラメータを1つだけ設定できる |
・ パラメータがobject型1つのみ ・ メソッドの戻り値を得るのが困難 ・ 優先順位付けや待機、停止など、スレッドの細かな制御が難しい ・同時に実行できるスレッドの数が制限されている |
| デリゲート (BeginInvoke) |
・ メソッドに型のあるパラメータを指定できる ・ 簡単に戻り値を得ることができる |
・ 優先順位付けや待機、停止など、スレッドの細かな制御が難しい ・ 同時に実行できるスレッドの数が制限されている |
| タイマー (Timer) |
・一定時間間隔でメソッドを実行することができる | ・スレッドプールがいっぱいだとうまく動作しない |
| マルチスレッドの実装方法と特徴一覧 | ||
●マルチスレッドの基本「スレッド」
.NETマルチスレッド・プログラミングにおいて、最も基本となるのがスレッド(Threadクラス)である。Threadクラス(System.Threading名前空間)は、指定したメソッドを別スレッドで起動(実行)する仕組みを提供する。スレッドの一時停止や中断、優先順位付けなどを細かく制御することもできる。
ただし、サーバ型のプログラムのように、リクエストを並行して処理するようなプログラムの場合、スレッドの生成・破棄を大量に繰り返す必要が出てくる。スレッドの生成にはそれなりのリソースが消費されるため、単純にこれを繰り返していてはパフォーマンスが低下する。
●スレッドのパフォーマンス問題を解決する「スレッドプール」
この問題を解決する仕組みが「スレッドプール」である。スレッドプールとは、キューに入れられたリクエスト(処理)をスレッドプールが用意しているスレッドにより次々に実行していく仕組みである。
スレッドプールでは、一度確保したスレッドのリソースをできる限り再利用するように設計されている。そのため、別スレッドで実行したいメソッドを、スレッドプール専用のキューに次々と入れる(登録する)だけで、後は自動的に登録したメソッドが別スレッドで効率よく実行されていく。
![]() |
| スレッドプールの仕組み |
| スレッドプールでは、別スレッドで実行したいメソッドを、スレッドプール専用のリクエスト・キューに次々と登録するだけで、後は自動的に登録したメソッドが別スレッドで効率よく実行されていく。 |
スレッドプールの機能は、主にThreadPoolクラス(System.Threading名前空間)で提供される。
●パラメータや戻り値が利用可能なマルチスレッド「デリゲート」
「デリゲート」によるマルチスレッドも、内部的には先のスレッドプールを利用している。しかし、デリゲートによるメソッドの呼び出しは、通常のメソッドの呼び出しと同様にパラメータや戻り値を持つことができる。
デリゲートについて簡単に説明しておこう。デリゲートは「メソッドの呼び出しをラッピングしたもの(包んだもの)」と理解してよい。メソッドをデリゲートでラッピングすると、デリゲートに登録したメソッドを、デリゲートを通じて間接的に呼び出すことができる。これは「メソッド呼び出しの仮想化」と呼ばれる。
複数のメソッドを1つのデリゲートに登録して一度に呼び出したり、登録したメソッドを動的に入れ替えたりすることができ、デリゲートはアプリケーションの設計上極めて便利に働くのだが、それについてはここでは詳しくは説明しない。
デリゲートに登録されたメソッドを実行するには、普通に実行するInvokeメソッドのほかに、別スレッドでメソッドを実行するBeginInvokeメソッドが使用できる(これらのメソッドはデリゲート・オブジェクトが持つメソッドである)。BeginInvokeメソッドを使用する場合には、デリゲートは上述したスレッドプールを利用して、登録されたメソッドを実行するという仕組みになっている。
![]() |
| デリゲートの仕組み |
| デリゲートでは、普通にメソッドを実行するInvokeメソッドだけでなく、別スレッドでメソッドを実行するBeginInvokeメソッドが使用できる。BeginInvokeメソッドは、スレッドプールを利用して、登録されたメソッドを実行する仕組みになっている。 |
●一定時間ごとに処理を実行する特殊なマルチスレッド「タイマー」
一定期間ごとにスレッドを呼び出して、指定した処理を実行させる特殊なマルチスレッドの実現方法として、「タイマー」(Timerクラス)という方法も用意されている。
.NET Frameworkのクラス・ライブラリには異なる名前空間でいくつかのTimerクラスが存在するが、System.Threading名前空間のTimerクラスがこの機能を提供している。なお、タイマーも内部的にはデリゲートと同様に、スレッドプールの機能を利用して実装されている。
以上、.NETで用意されているマルチスレッド・プログラミングの実現方法のそれぞれの特徴について簡単に説明したが、1点明記しておくべきことがある。
Threadクラス以外のThreadPoolクラス、デリゲートおよびTimerクラスは、スレッドプールを用いてマルチスレッド処理が実装されているが、.NETが提供するスレッドプールには、「同時に実行できるスレッドの数に制限がある」ということに注意しなくてはならない。これは1プロセス当たり「プロセッサの数×25」個のスレッドしか同時に実行できないという制限である。次回でもう少し詳しく解説するが、同じアプリケーション内で制限数以上のスレッドをスレッドプールで実行しようとすると、うまく動作しないという不具合が発生する可能性が出てくるので注意してほしい。
以下、それぞれの方法について具体的な実装方法を、サンプル・コードを交えて説明する。
| INDEX | ||
| .NETマルチスレッド・プログラミング入門 | ||
| 第2回 .NETにおけるマルチスレッドの実装方法を総括 | ||
| 1..NETにおけるマルチスレッド・プログラミングの方法 | ||
| 2.Threadクラスによるマルチスレッド | ||
| 3.スレッドプールによるマルチスレッド/デリゲートによるマルチスレッド | ||
| 4.タイマーを使ったスレッドの実行 | ||
| 「.NETマルチスレッド・プログラミング入門」 |
ホワイトペーパー(TechTargetジャパン)
- LocalConnection APIと動的なスタイリング (2010/2/9)
Webページ上の複数のSilverlightアプリ間でメッセージ通信をする方法とは? コントロールの見た目を動的に設定する方法とは? - ASP.NET MVC 2:モデルの検証 (2010/2/8)
ASP.NET MVC 2で導入される入力検証機能を使った実装を紹介。シンプルな属性の追加によるエレガントな実装が可能となっている - ASP.NETによる3階層Webアプリ「ITブック」構築 (2010/2/5)
ちょっとした改造で、あなたのWebアプリは劇的に使いやすく、かっこよくなる。まずは元となるWebアプリを標準的手法で構築 - .NET TIPS - .NET開発のテクニックとヒント集 - (2010/2/4)
− カスタムMVCビューエンジンを利用するには?(活用編)
− フォーム全体へのドッキングでつまみを表示するには?
− リストボックスでTextBlockの文字列を折り返すには?
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | 企業の仮想化に足りない“発想”とは? 仮想化運用管理のキモは意外なところに! New! |
| ◆ | 操作もマニュアルも分かりやすい! ユーザー視点で開発されたPC管理ツール New! |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |

| ◆ | セキュリティを知り尽くす上野氏が登壇! @ITメールソリューションLive! in Tokyo |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
| ◆ | 世界に通用するストレージの作り方とは? 製品に込めた思いを富士通の開発者に聞く |

| ◆ | OSSで手間も時間も、障害も減った―― 「マピオンの事例」オープンソース活用法 |
| ◆ | 「ノートPCの持ち出し禁止」で大丈夫? 情報漏えいを防ぐ管理手法とインフラは? |
| ◆ | 1日の処理を1秒に――MySQLの達人が語る 「コスト削減」できるチューニング |

| ◆ | ドキュメント作成を自動化して、SEの作業 効率を大幅アップ! Visio 2007の魅力 |
| ◆ | 急速に広がるHyper-Vでのサーバ仮想化 そのベストプラクティスをデルが解説 |
| ◆ | @IT主催セミナーで語られた、「担当者に 求められるセキュリティ対策」をレポート |

| ◆ | @IT「Windows 7」 特設サイトオープン! 最新情報・移行ノウハウを公開しています |









