std::mutex: 排他制御の基本

複数スレッドの共有データ競合を防ぐ。

mutex
相互排他。一度に1つのスレッドのみアクセス許可。
lock_guard
RAIIでmutexを自動管理。
デッドロック
複数のロックが互いに待ち合う膠着状態。

mutexとは?

トイレの個室

中に入ったらロック。出たらアンロック。2人同時は入れない。

lock_guard Example
#include <mutex>
#include <thread>
std::mutex mtx;
int counter = 0;
void increment() {
std::lock_guard<std::mutex> lock(mtx); // RAII
++counter;
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
// counter == 2 (競合なし)
}
実行結果
t1, t2 並列実行
counter = 2 (競合なし)
Bad
// ❌ Bad: 手動 lock/unlock
std::mutex mtx;
void risky() {
mtx.lock();
do_something(); // ここで例外が発生したら?
mtx.unlock(); // ← ここに到達しない = デッドロック
}
Good
// ✅ Good: lock_guard (RAII)
std::mutex mtx;
void safe() {
std::lock_guard<std::mutex> lock(mtx);
do_something(); // 例外が発生しても自動でunlock
}

scoped_lock (C++17)

Multiple Mutexes
// C++17: 複数の mutex を安全にロック
std::mutex m1, m2;
void transfer(Account& from, Account& to, int amount) {
std::scoped_lock lock(m1, m2); // デッドロック回避
from.balance -= amount;
to.balance += amount;
}
Tip: scoped_lock は複数の mutex を同時にロックしてデッドロックを回避。

合格ライン

lock_guard を使える
デッドロックの原因を説明できる

参考リンク

演習課題

課題1: lock_guard
共有カウンタを複数スレッドからインクリメントし、lock_guard で保護してください。
課題2: デッドロック回避
std::scoped_lock を使って複数の mutex を安全にロックしてください。

次のステップ