std::unique_lock
From 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を構築します。オプションで、指定されたミューテックスをロックします(つまり、所有権を取得します)。(public member function) | |
| 所有している場合、関連付けられたミューテックスをアンロックします(つまり、所有権を解放します)。 (public member function) | |
| 所有している場合、ミューテックスをアンロックします(つまり、所有権を解放します)。そして、別のミューテックスの所有権を取得します。 (public member function) | |
ロック | |
| 関連付けられたミューテックスをロックします(つまり、所有権を取得します)。 (public member function) | |
| 関連付けられたミューテックスをブロックせずにロックしようとします(つまり、所有権を取得します)。 (public member function) | |
| 指定された時間だけミューテックスが利用できない場合に戻る、関連付けられたTimedLockableミューテックスのロック(つまり、所有権の取得)を試みます。 (public member function) | |
| 指定された時間点に達するまでミューテックスが利用できない場合に戻る、関連付けられたTimedLockableミューテックスのロック(つまり、所有権の取得)を試みます。 (public member function) | |
| 関連付けられたミューテックスをアンロックします(つまり、所有権を解放します)。 (public member function) | |
変更 | |
| 別のstd::unique_lockと状態をスワップします。 (public member function) | |
| 関連付けられたミューテックスをアンロックせずに(つまり、所有権を解放せずに)解除します。 (public member function) | |
監視 | |
| 関連付けられたミューテックスへのポインタを返します。 (public member function) | |
| ロックが関連付けられたミューテックスを所有しているか(つまり、ロックしているか)どうかをテストします。 (public member function) | |
| ロックが関連付けられたミューテックスを所有しているか(つまり、ロックしているか)どうかをテストします。 (public member function) | |
[編集] 非メンバ関数
| (C++11) |
std::swap アルゴリズムを特殊化する (関数テンプレート) |
[編集] 例
このコードを実行
#include <iostream> #include <mutex> #include <thread> 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 lock1{from.m, std::defer_lock}; std::unique_lock 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(); std::cout << "acc1: " << acc1.num_things << "\n" "acc2: " << acc2.num_things << '\n'; }
出力
acc1: 95 acc2: 55
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2981 | C++17 | unique_lock<Mutex>からの冗長な推論ガイドが提供されていました。 |
削除 |
[編集] 関連項目
| (C++11) |
指定されたミューテックスをロックし、いずれかが利用できない場合はブロックする (関数テンプレート) |
| (C++11) |
厳密なスコープベースのミューテックス所有権ラッパーを実装する (クラステンプレート) |
| (C++17) |
デッドロックを回避する、複数のミューテックス用のRAIIラッパー (クラステンプレート) |
| (C++11) |
基本的な相互排他機能を提供する (クラス) |