- mutex[meta header]
- std[meta namespace]
- scoped_lock[meta class]
- function[meta id-type]
- cpp17[meta cpp]
explicit scoped_lock(MutexTypes&... m); // (1)
explicit scoped_lock(adopt_lock_t, MutexTypes&... m); // (2)
scoped_lock(const scoped_lock&) = delete; // (3)
- adopt_lock_t[link /reference/mutex/adopt_lock.md]
- (1) : 非ロック状態のミューテックスオブジェクトへの参照を複数受け取り、メンバ変数として参照を保持する。
- (2) : ロック取得済みミューテックスオブジェクトへの参照を複数受け取り、メンバ変数として参照を保持する。
- (3) : コピーコンストラクタ。コピー不可。非トリビアルなコンストラクタが定義されているため、ムーブコンストラクタは定義されない
- (1) :
MutexTypes...が空であればなにもしない。単一要素であればm.lock()を呼び出し、そうでなければlock(m...)を呼び出す。
#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);
// ...共有リソースにアクセス...
} // ロックを手放す
}
- std::timed_mutex[link /reference/mutex/timed_mutex.md]
- m1.lock()[link /reference/mutex/mutex/lock.md]
- m2.lock()[link /reference/mutex/timed_mutex/lock.md]
- std::adopt_lock[link /reference/mutex/adopt_lock.md]