ミューテックス
複数のスレッドが共有リソースに同時アクセスすることを防ぐ排他制御の同期プリミティブ
ミューテックスとは
ミューテックス (Mutex: Mutual Exclusion) は、複数のスレッドが共有リソースへ同時にアクセスすることを防ぐ同期プリミティブである。1 つのスレッドがロックを取得している間、他のスレッドは解放されるまで待機する。
ミューテックス vs セマフォ
ミューテックスとセマフォの違いを以下にまとめる。
| 観点 | ミューテックス | セマフォ |
|---|---|---|
| 同時アクセス数 | 1 (排他) | N (カウンタ) |
| 所有権 | ロックした者だけが解放 | 誰でも解放可能 |
| 用途 | 共有リソースの保護 | リソースプールの制限 |
Rust の Mutex
Rust の Mutex のコード例を示す。
use std::sync::{Arc, Mutex};
use std::thread;
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
handles.push(thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
})); // ロックはスコープを抜けると自動解放
}
for h in handles { h.join().unwrap(); }
assert_eq!(*counter.lock().unwrap(), 10);
Go の sync.Mutex
Go の sync.Mutex のコード例を示す。
var mu sync.Mutex
var count int
mu.Lock()
count++
mu.Unlock()
デッドロック
デッドロックを図で示す。
スレッド A: Lock(X) → Lock(Y) を待つ
スレッド B: Lock(Y) → Lock(X) を待つ
→ 互いに相手の解放を待ち、永久に停止
| 対策 | 説明 |
|---|---|
| ロック順序の統一 | 常に X → Y の順でロック |
| タイムアウト | 一定時間で諦める |
| ロックの粒度を細かく | 必要最小限の範囲でロック |
Lambda とミューテックス
Lambda はリクエストごとに独立した実行環境で動作するため、プロセス内のミューテックスは不要。複数の Lambda 間の排他制御には分散ロック (DynamoDB の条件付き書き込み) を使う。
// Lambda: 分散ロック (ミューテックスの代替)
await db.put({
TableName: 'locks',
Item: { lockId: 'resource-1', owner: requestId, expiresAt: Date.now() + 30000 },
ConditionExpression: 'attribute_not_exists(lockId) OR expiresAt < :now',
ExpressionAttributeValues: { ':now': Date.now() },
});
ロックフリーアルゴリズム
ロックフリーアルゴリズムを以下に整理する。
| 方式 | 説明 |
|---|---|
| CAS (Compare-And-Swap) | CPU 命令でアトミックに更新 |
| Atomic 型 | ロックなしでカウンタを更新 |
| 不変データ | データを変更しない設計 |
ミューテックスを扱う関連書籍も多い。
この記事は役に立ちましたか?
関連用語
並行処理
複数のタスクを論理的に同時に進行させるプログラミング手法で、システムのスループットと応答性を向上させる
分散ロック
分散システムで複数のプロセスが同じリソースに同時アクセスすることを防ぐ排他制御
プロセスとスレッドの違いとは - メモリ空間・生成コスト・通信方法を比較
プロセスとスレッドの違いをメモリ空間・生成コスト・通信方法の 3 軸で比較。マルチスレッドの注意点と Go/Rust の並行処理モデルとの関係も図解で解説
楽観的ロック
データの読み取り時にロックせず、更新時にバージョンを検証して競合を検出する排他制御
レースコンディション
複数のプロセスやスレッドが共有リソースに同時アクセスし、実行順序によって結果が変わる不具合
イベントループ
Node.js のシングルスレッドで非同期 I/O を実現する実行モデル
関連する記事
機械学習・AI 本ガイド - エンジニアが読むべき技術書の選び方
機械学習の基礎から実践まで学べる技術書の選び方を紹介。「Python ではじめる機械学習」などのハンズオン本を軸に、数学が苦手な人向けの学習ルートと ML 本の賞味期限の見極め方を解説します。
アルゴリズム本ガイド - 競プロだけじゃない、実務に活きる選び方
アルゴリズム本の 3 タイプと、実務でアルゴリズムの知識が活きる場面、数学が苦手な人向けの学習ルートを紹介します。
「あとで読む」ブックマークが 100 件を超えたら本を買え
ブラウザのブックマークに技術記事を溜め込んでいませんか。断片的な記事を 100 件読むより、同じテーマの本を 1 冊読む方が効率的な理由を解説します。