C#マルチスレッドの詳細解説
マルチスレッドとは、1つのプログラム内で複数のスレッドを同時に実行するもので、各スレッドは異なるタスクを独立して実行できます。C#では、System.Threading名前空間のクラスを使用して、マルチスレッドを作成して管理します。
C#では、スレッド作成方法は大きく2通りあります、Threadクラスを使用する方法と、ThreadPoolクラスを使用する方法です。
- スレッドクラスを利用して:
まず、Thread オブジェクトを作成し、コンストラクタで実行したいメソッドを指定します。 そして、Start メソッドを使用してスレッドを開始すると、指定したメソッドでスレッドが実行されます。 例えば、
using System;
using System.Threading;
public class Program
{
public static void Main(string[] args)
{
Thread thread = new Thread(new ThreadStart(DoWork));
thread.Start();
// 主线程继续执行其他操作
}
public static void DoWork()
{
// 在这里执行线程的任务
}
}
- スレッドプールのクラスを使用する
スレッドプールを使用すると、スレッドを手軽に管理できます。手動で Thread オブジェクトを作成する必要はありません。タスクをスレッドプールに追加するには、 ThreadPool.QueueUserWorkItem メソッドを使用できます。スレッドプールは、自動的にスレッドを割り当ててタスクを実行します。例を次に示します。
using System;
using System.Threading;
public class Program
{
public static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(DoWork);
// 主线程继续执行其他操作
}
public static void DoWork(object state)
{
// 在这里执行线程的任务
}
}
- スレッドの同期
複数のスレッドで共有リソースに同時にアクセスする可能性があるマルチスレッドプログラミングでは、競合状態やデータの不整合を防ぐために、スレッド同期メカニズムを使用して共有リソースを保護することが必要です。C#では、lockキーワード、Monitorクラス、Mutexクラス、Semaphoreクラスなど、さまざまなスレッド同期メカニズムが提供されています。どのメカニズムを選択するかは、具体的な要件とシナリオによって異なります。
たとえば、ロックキーワードを使用すると、共有リソースにアクセスする前にロックをかけて、アクセス後にロックを解放することで、同一時刻に1つのスレッドのみが共有リソースにアクセスすることを確実にできます。サンプルコードを以下に示します。
using System;
using System.Threading;
public class Program
{
private static object lockObj = new object();
public static void Main(string[] args)
{
Thread thread1 = new Thread(DoWork);
Thread thread2 = new Thread(DoWork);
thread1.Start();
thread2.Start();
// 主线程继续执行其他操作
}
public static void DoWork()
{
lock (lockObj)
{
// 在这里访问共享资源
}
}
}
これらはC#におけるマルチスレッドの基礎的な使用方法で、一般的なスレッド同期のしくみです。実際の開発では、スレッド安全性、スレッドの優先順位とスケジューリングに関する問題、スレッドの例外とそのキャンセル操作の処理などを考慮する必要があります。