スレッドおよびスレッド処理Threads and threading

マルチスレッドによりアプリケーションの応答性が向上し、さらにアプリケーションがマルチプロセッサやマルチコア システム上で実行されている場合にはそのスループットも向上します。Multithreading allows you to increase the responsiveness of your application and, if your application runs on a multiprocessor or multi-core system, increase its throughput.

プロセスおよびスレッドProcesses and threads

プロセスは、実行中のプログラムです。A process is an executing program. オペレーティング システムはプロセスを使用して実行中のアプリケーションを区別します。An operating system uses processes to separate the applications that are being executed. スレッドは、オペレーティング システムがプロセッサ時間を割り当てる基本単位です。A thread is the basic unit to which an operating system allocates processor time. 各スレッドにはスケジューリングの優先順位があり、スレッドの実行が一時停止されるときにシステムがスレッド コンテキストを保存するために使用する構造体のセットが保持されています。Each thread has a scheduling priority and maintains a set of structures the system uses to save the thread context when the thread's execution is paused. スレッド コンテキストには、スレッドがシームレスに実行を再開するために必要なすべての情報 (スレッドの CPU レジスタとスタックのセットなど) が含まれています。The thread context includes all the information the thread needs to seamlessly resume execution, including the thread's set of CPU registers and stack. 複数のスレッドは、プロセスのコンテキストで実行できます。Multiple threads can run in the context of a process. プロセスのすべてのスレッドで、仮想アドレス空間が共有されます。All threads of a process share its virtual address space. スレッドは、別のスレッドによって実行されている部分を含む、プログラム コードのすべての部分を実行できます。A thread can execute any part of the program code, including parts currently being executed by another thread.

注意

.NET Framework では、アプリケーション ドメインの使用によりプロセス内でアプリケーションを分離する方法が提供されます。The .NET Framework provides a way to isolate applications within a process with the use of application domains. (アプリケーション ドメインは .NET Core で使用できません。)詳細については、「アプリケーション ドメイン」の記事の「アプリケーション ドメインとスレッド」のセクションを参照してください。(Application domains are not available on .NET Core.) For more information, see the Application domains and threads section of the Application domains article.

既定では、.NET プログラムは、1 つのスレッド (よくプライマリ スレッドと呼ばれます) で開始します。By default, a .NET program is started with a single thread, often called the primary thread. ただし、コードを並列実行したり、プライマリ スレッドと同時に実行したりするための追加のスレッドを作成することができます。However, it can create additional threads to execute code in parallel or concurrently with the primary thread. このようなスレッドは、よくワーカー スレッドと呼ばれます。These threads are often called worker threads.

複数のスレッドを使用する場合When to use multiple threads

複数のスレッドを使用すると、アプリケーションの応答性が向上し、さらにマルチプロセッサやマルチコア システムの利点を活用してアプリケーションのそのスループットも向上します。You use multiple threads to increase the responsiveness of your application and to take advantage of a multiprocessor or multi-core system to increase the application's throughput.

プライマリ スレッドがユーザー インターフェイス要素を担い、ユーザーの操作に応答するデスクトップ アプリケーションを考えてください。Consider a desktop application, in which the primary thread is responsible for user interface elements and responds to user actions. ワーカー スレッドは、時間のかかる操作を実行する場合に使用します。そうしないと、プライマリ スレッドが一杯になり、ユーザー インターフェイスが応答しなくなります。Use worker threads to perform time-consuming operations that, otherwise, would occupy the primary thread and make the user interface non-responsive. ネットワークやデバイスの通信専用のスレッドを使用して、受信したメッセージやイベントへの応答性を高めることもできます。You also can use a dedicated thread for network or device communication to be more responsive to incoming messages or events.

並列で実行できる操作をプログラムが実行する場合、そのような操作を別のスレッドで実行し、プログラムをマルチプロセッサやマルチコア システムで実行することで、合計実行時間を短縮することができます。If your program performs operations that can be done in parallel, the total execution time can be decreased by performing those operations in separate threads and running the program on a multiprocessor or multi-core system. このようなシステムでは、マルチスレッドを使用すると、応答性とともにスループットも向上する場合があります。On such a system, use of multithreading might increase throughput along with the increased responsiveness.

.NET でのマルチスレッドの使用方法How to use multithreading in .NET

.NET Framework 4 より、マルチスレッドを使用するために推奨される方法が、タスク並列ライブラリ (TPL)Parallel LINQ (PLINQ) の使用です。Starting with the .NET Framework 4, the recommended way to utilize multithreading is to use Task Parallel Library (TPL) and Parallel LINQ (PLINQ). 詳細については、並列プログラミングに関するページを参照してください。For more information, see Parallel programming.

TPL も PLINQ も、ThreadPool スレッドに依存しています。Both TPL and PLINQ rely on the ThreadPool threads. System.Threading.ThreadPool クラスから .NET アプリケーションにワーカー スレッドのプールが提供されます。The System.Threading.ThreadPool class provides a .NET application with a pool of worker threads. スレッド プールのスレッドを使用することもできます。You also can use thread pool threads. 詳しくは、「マネージド スレッド プール」を参照してください。For more information, see The managed thread pool.

最後に、マネージド スレッドを表す System.Threading.Thread クラスを使用することができます。At last, you can use the System.Threading.Thread class that represents a managed thread. 詳細については、「スレッドの使用とスレッド処理」を参照してください。For more information, see Using threads and threading.

複数のスレッドで、共有リソースにアクセスできる必要があります。Multiple threads might need to access a shared resource. リソースを壊れていない状態のまま保持し、競合状態を避けるには、スレッド アクセス権を同期する必要があります。To keep the resource in a uncorrupted state and avoid race conditions, you must synchronize the thread access to it. 複数のスレッドの相互作用の調整が必要になる場合もあります。You also might want to coordinate the interaction of multiple threads. .NET では、共有リソースへのアクセスを同期する場合や、スレッド相互作用を調整する場合に使用できるさまざまな型が提供されます。.NET provides a range of types that you can use to synchronize access to a shared resource or coordinate thread interaction. 詳細については、「同期プリミティブの概要」を参照してください。For more information, see Overview of synchronization primitives.

スレッドで例外を処理します。Do handle exceptions in threads. スレッドで未処理の例外が発生すると、通常はプロセスが終了します。Unhandled exceptions in threads generally terminate the process. 詳細については、「マネージド スレッドの例外」を参照してください。For more information, see Exceptions in managed threads.

関連項目See also