スレッドおよびスレッド処理

マルチスレッドによりアプリケーションの応答性が向上し、さらにアプリケーションがマルチプロセッサやマルチコア システム上で実行されている場合にはそのスループットも向上します。

プロセスおよびスレッド

プロセスは、実行中のプログラムです。 オペレーティング システムはプロセスを使用して実行中のアプリケーションを区別します。 スレッドは、オペレーティング システムがプロセッサ時間を割り当てる基本単位です。 各スレッドにはスケジューリングの優先順位があり、スレッドの実行が一時停止されるときにシステムがスレッド コンテキストを保存するために使用する構造体のセットが保持されています。 スレッド コンテキストには、スレッドがシームレスに実行を再開するために必要なすべての情報 (スレッドの CPU レジスタとスタックのセットなど) が含まれています。 複数のスレッドは、プロセスのコンテキストで実行できます。 プロセスのすべてのスレッドで、仮想アドレス空間が共有されます。 スレッドは、別のスレッドによって実行されている部分を含む、プログラム コードのすべての部分を実行できます。

注意

.NET Framework では、"アプリケーション ドメイン" の使用によりプロセス内でアプリケーションを分離する方法が提供されます。 (アプリケーション ドメインは .NET Core で使用できません。)詳細については、「アプリケーション ドメイン」の記事の「アプリケーション ドメインとスレッド」のセクションを参照してください。

既定では、.NET プログラムは、1 つのスレッド (よくプライマリ スレッドと呼ばれます) で開始します。 ただし、コードを並列実行したり、プライマリ スレッドと同時に実行したりするための追加のスレッドを作成することができます。 このようなスレッドは、よくワーカー スレッドと呼ばれます。

複数のスレッドを使用する場合

複数のスレッドを使用すると、アプリケーションの応答性が向上し、さらにマルチプロセッサやマルチコア システムの利点を活用してアプリケーションのそのスループットも向上します。

プライマリ スレッドがユーザー インターフェイス要素を担い、ユーザーの操作に応答するデスクトップ アプリケーションを考えてください。 ワーカー スレッドは、時間のかかる操作を実行する場合に使用します。そうしないと、プライマリ スレッドが一杯になり、ユーザー インターフェイスが応答しなくなります。 ネットワークやデバイスの通信専用のスレッドを使用して、受信したメッセージやイベントへの応答性を高めることもできます。

並列で実行できる操作をプログラムが実行する場合、そのような操作を別のスレッドで実行し、プログラムをマルチプロセッサやマルチコア システムで実行することで、合計実行時間を短縮することができます。 このようなシステムでは、マルチスレッドを使用すると、応答性とともにスループットも向上する場合があります。

.NET でのマルチスレッドの使用方法

.NET Framework 4 より、マルチスレッドを使用するために推奨される方法が、タスク並列ライブラリ (TPL)Parallel LINQ (PLINQ) の使用です。 詳細については、並列プログラミングに関するページを参照してください。

TPL も PLINQ も、ThreadPool スレッドに依存しています。 System.Threading.ThreadPool クラスから .NET アプリケーションにワーカー スレッドのプールが提供されます。 スレッド プールのスレッドを使用することもできます。 詳しくは、「マネージド スレッド プール」を参照してください。

最後に、マネージド スレッドを表す System.Threading.Thread クラスを使用することができます。 詳細については、「スレッドの使用とスレッド処理」を参照してください。

複数のスレッドで、共有リソースにアクセスできる必要があります。 リソースを壊れていない状態のまま保持し、競合状態を避けるには、スレッド アクセス権を同期する必要があります。 複数のスレッドの相互作用の調整が必要になる場合もあります。 .NET では、共有リソースへのアクセスを同期する場合や、スレッド相互作用を調整する場合に使用できるさまざまな型が提供されます。 詳細については、「同期プリミティブの概要」を参照してください。

スレッドで例外を処理します。 スレッドで未処理の例外が発生すると、通常はプロセスが終了します。 詳細については、「マネージド スレッドの例外」を参照してください。

関連項目