std::unique_lock
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <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 ラッパー (クラステンプレート) |