explicit scoped_lock(MutexTypes&... m); // (1)
explicit scoped_lock(adopt_lock_t, MutexTypes&... m); // (2)
scoped_lock(const scoped_lock&) = delete; // (3)
概要
- (1) : 非ロック状態のミューテックスオブジェクトへの参照を複数受け取り、メンバ変数として参照を保持する。
- (2) : ロック取得済みミューテックスオブジェクトへの参照を複数受け取り、メンバ変数として参照を保持する。
- (3) : コピーコンストラクタ。コピー不可。非トリビアルなコンストラクタが定義されているため、ムーブコンストラクタは定義されない
効果
- (1) :
MutexTypes...
が空であればなにもしない。単一要素であればm.lock()
を呼び出し、そうでなければlock(m...)
を呼び出す。
例外
- (2) : 投げない
例
#include <iostream>
#include <mutex>
int main()
{
std::mutex m1;
std::timed_mutex m2;
// (1)
{
// m1とm2のロックを取得
std::scoped_lock<std::mutex, std::timed_mutex> lk{m1, m2};
// ...共有リソースにアクセス...
} // ロックを手放す
// (2)
{
m1.lock();
m2.lock();
// ロック取得済みのミューテックスを、std::scoped_lockに管理させる
std::scoped_lock lk(std::adopt_lock, m1, m2);
// ...共有リソースにアクセス...
} // ロックを手放す
}
出力
バージョン
言語
- C++17
処理系
- Clang: 5.0 ✅
- GCC: 7.3 ✅
- Visual C++: ??