排他処理
std::mutex はマルチスレッディングでのアクセス制御を行います。lockunlock が提供されています。
std::mutex m; int n; // 共有データ m.lock(); n++; // 共有データの操作 m.unlock();
共有データを操作するコード領域(クリティカルセクション/リージョン)を lock()unlock で囲むと、ただ一つのスレッドが共有データにアクセスすることを保証します。ある lock 中のコード領域に他のスレッドが lock を試行すると、unlock されるまで他のスレッドは実行をブロックされます。
これとは別に、コード領域の lock をブロックされることなく取得する try_lock が提供されています。
std::mutex m; int n; // 共有データ if(m.try_lock()) { n++; // 共有データの操作 m.unlock(); } else { // 他の操作 }
std::recursive_mutex は複数回取得できる lock 操作と、取得した回数だけ呼び出さないと unlock しない unlock 操作を提供しています。
std::recursive_mutex m; int n; // 共有データ void f(int count) { m.lock(); n++; // 共有データの操作 if(--count > 0) f(count); m.unlock(); }
指定の時間だけ lock する操作は、std::timed_mutex が提供します。
std::timed_mutex m; int n; // 共有データ if(m.try_lock_for(std::chrono::seconds(5))) { // 五秒間 n++; // 共有データの操作 m.unlock(); } else { // 他の操作 }