C#におけるスレッド同期の基本:lockステートメントとMutexクラスの使い方
マルチスレッドアプリケーションでは、複数のスレッドが同時に同じリソースへアクセスすると、データの不整合や競合状態(レースコンディション)が発生する恐れがあります。そこで重要になるのが「同期(Synchronization)」です。同期を適切に行うことでリソースへのアクセスを制御し、安全な並行処理を実現できます。
Mutexによるスレッドの同期
ミューテックス(Mutex)は、プロセスをまたいだスレッド間の同期にも利用できる同期プリミティブです。特定のコードブロックを、複数のスレッドが同時に実行しないよう制御したい場合に使用します。
lockステートメントの基本
C#のlockステートメントを使用すると、指定したコードブロックを他のスレッドに中断されることなく排他的に実行できます。コードブロックの実行期間中、指定されたオブジェクトに対して相互排他ロックが取得されます。
lockステートメントにはオブジェクトを引数として渡します。このとき指定するパラメータは、参照型に基づくオブジェクトである必要があります。
public class Demo {
private System.Object myLock = new System.Object();
public void Process() {
lock (myLock) {
// 排他制御が必要な処理
}
}
}Mutexクラスの概要と生成方法
C#のMutexクラスは同期プリミティブの一種で、単一プロセス内のスレッド同期だけでなく、プロセス間の同期にも使用できる点が大きな特徴です。
新しいMutexを作成する基本的な方法は次のとおりです。
private static Mutex m = new Mutex();
-
C#でスレッドを強制終了する方法|フラグ変数を使った安全な終了手法
C#で実行中のスレッドを終了させたい場合、かつては Thread.Abort() メソッドが使われていましたが、現在は非推奨となっています(.NET Core 以降ではサポートされていません)。代わりに、bool型のフラグ変数を活用して、スレッドの処理を安全に停止させる方法が一般的です。 この記事では、フラグ変数と Thread.Join() を組み合わせて、実行中のスレッドを確実に終了させる方法をサンプルコード付きで解説します。 1. スレッドを作成して開始する まず、新しいスレッドを作成し、開始します。 // 新しいスレッドを作成 Thread thread = new Thread(c.
-
Javaのオブジェクトレベルロックとクラスレベルロックの違いを徹底解説
マルチスレッドアプリケーションにおいて、オブジェクトレベルロックとクラスレベルロックは、どちらも同期(synchronization)を実現するための重要な仕組みです。この記事では、それぞれの特徴や動作の違いを、コード例と実行結果とともにわかりやすく解説します。 オブジェクトレベルロックとは Javaでは、すべてのオブジェクトが固有のロックを1つ持っています。あるスレッドが特定のオブジェクトに対してsynchronizedメソッドを実行したい場合、まずそのオブジェクトのロックを取得する必要があります。 ロックを取得できたスレッドは、そのオブジェクトの任意のsynchronizedメソッドを実行