std::unique_lock
提供: cppreference.com
ヘッダ <mutex> で定義
|
||
template< class Mutex > class unique_lock; |
(C++11以上) | |
クラス unique_lock は遅延ロック、時間制約付きロック、再帰的ロック、ロック所有権の転送および条件変数の使用をサポートする汎用のミューテックス所有権ラッパーです。
クラス unique_lock はムーブ可能ですが、コピー可能ではありません。 MoveConstructible および MoveAssignable の要件は満たしますが、 CopyConstructible および CopyAssignable の要件は満たしません。
クラス unique_lock は BasicLockable の要件を満たします。 Mutex が Lockable の要件を満たす場合、 unique_lock も Lockable の要件を満たします (例えば std::lock で使用できます)。 Mutex が TimedLockable の要件を満たす場合、 unique_lock も TimedLockable の要件を満たします。
目次 |
[編集] テンプレート引数
Mutex | - | ロックするミューテックスの型。 BasicLockable の要件を満たさなければなりません |
[編集] メンバ型
型 | 定義 |
mutex_type
|
Mutex |
[編集] メンバ関数
unique_lock を構築し、オプションで指定されたミューテックスをロックします (パブリックメンバ関数) | |
所有権を持っている場合は、紐付けられているミューテックスのロックを解除します (パブリックメンバ関数) | |
所有権を持っている場合は、紐付けられているミューテックスのロックを解除し、別の unique_lock から所有権を取得します (パブリックメンバ関数) | |
ロック | |
紐付けられているミューテックスをロックします (パブリックメンバ関数) | |
紐付けられているミューテックスのロックを試みます。 ミューテックスが利用可能でなければ戻ります (パブリックメンバ関数) | |
紐付けられている TimedLockable なミューテックスのロックを試みます。 指定された時間ミューテックスが利用可能にならなければ戻ります (パブリックメンバ関数) | |
紐付けられている TimedLockableなミューテックスのロックを試みます。 指定された時点までミューテックスが利用可能にならなければ戻ります (パブリックメンバ関数) | |
紐付けられているミューテックスのロックを解除します (パブリックメンバ関数) | |
変更 | |
別の std::unique_lock と状態を入れ替えます (パブリックメンバ関数) | |
ロックを解除せずにミューテックスとの紐付けを解除します (パブリックメンバ関数) | |
観察 | |
紐付けられているミューテックスを指すポインタを返します (パブリックメンバ関数) | |
紐付けられているミューテックスの所有権を保持しているかどうか調べます (パブリックメンバ関数) | |
紐付けられているミューテックスの所有権を保持しているかどうか調べます (パブリックメンバ関数) |
[編集] 非メンバ関数
(C++11) |
unique_lock に対する std::swap の特殊化 (関数テンプレート) |
[編集] 例
Run this code
#include <mutex> #include <thread> #include <chrono> struct Box { explicit Box(int num) : num_things{num} {} int num_things; std::mutex m; }; void transfer(Box &from, Box &to, int num) { // don't actually take the locks yet std::unique_lock<std::mutex> lock1(from.m, std::defer_lock); std::unique_lock<std::mutex> lock2(to.m, std::defer_lock); // lock both unique_locks without deadlock std::lock(lock1, lock2); from.num_things -= num; to.num_things += num; // 'from.m' and 'to.m' mutexes unlocked in 'unique_lock' dtors } int main() { Box acc1(100); Box acc2(50); std::thread t1(transfer, std::ref(acc1), std::ref(acc2), 10); std::thread t2(transfer, std::ref(acc2), std::ref(acc1), 5); t1.join(); t2.join(); }
[編集] 欠陥報告
以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。
DR | 適用先 | 発行時の動作 | 正しい動作 |
---|---|---|---|
LWG 2981 | C++17 | redundant deduction guide from unique_lock<Mutex> was provided
|
removed |
[編集] 関連項目
(C++11) |
厳密なスコープベースのミューテックス所有権のラッパーを実装します (クラステンプレート) |
(C++17) |
複数のミューテックスに対するデッドロック回避機能付きの RAII ラッパー (クラステンプレート) |