std:: unique_lock
|
定義先ヘッダ
<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
アルゴリズムを特殊化
(関数テンプレート) |
注記
初心者がよく犯す間違いは、
unique_lock
変数に名前を「付け忘れる」ことです。例えば、
std
::
unique_lock
(
mtx
)
;
(これは
mtx
という名前の
unique_lock
変数をデフォルト構築します)や、
std
::
unique_lock
{
mtx
}
;
(これは即座に破棄されるprvalueオブジェクトを構築します)のように記述することで、スコープの残りの期間ミューテックスを保持するロックを実際には構築していない状態になります。
例
#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) { // まだロックを取得しない std::unique_lock lock1{from.m, std::defer_lock}; std::unique_lock lock2{to.m, std::defer_lock}; // デッドロックなしで両方のunique_lockをロック std::lock(lock1, lock2); from.num_things -= num; to.num_things += num; // "from.m"と"to.m"ミューテックスはunique_lockのデストラクタでアンロックされる } 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)
|
基本的な相互排他機能を提供する
(クラス) |