排他処理
std::mutex はマルチスレッディングでのアクセス制御を行います。lock と unlock が提供されています。
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 {
// 他の操作
}