std::mutex: 排他制御の基本
複数スレッドの共有データ競合を防ぐ。
mutex
相互排他。一度に1つのスレッドのみアクセス許可。
lock_guard
RAIIでmutexを自動管理。
デッドロック
複数のロックが互いに待ち合う膠着状態。
mutexとは?
#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/unlockstd::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)
// 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 を安全にロックしてください。