名前空間
変種
操作

std::unique_lock

提供: cppreference.com
< cpp‎ | thread
 
 
スレッドサポートライブラリ
スレッド
(C++11)
(C++20)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
相互排他
(C++11)
汎用ロック管理
(C++11)
unique_lock
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
フューチャー
(C++11)
(C++11)
(C++11)
(C++11)
 
 
ヘッダ <mutex> で定義
template< class Mutex >
class unique_lock;
(C++11以上)

クラス unique_lock は遅延ロック、時間制約付きロック、再帰的ロック、ロック所有権の転送および条件変数の使用をサポートする汎用のミューテックス所有権ラッパーです。

クラス unique_lock はムーブ可能ですが、コピー可能ではありません。 MoveConstructible および MoveAssignable の要件は満たしますが、 CopyConstructible および CopyAssignable の要件は満たしません。

クラス unique_lockBasicLockable の要件を満たします。 MutexLockable の要件を満たす場合、 unique_lockLockable の要件を満たします (例えば std::lock で使用できます)。 MutexTimedLockable の要件を満たす場合、 unique_lockTimedLockable の要件を満たします。

目次

[編集] テンプレート引数

Mutex - ロックするミューテックスの型。 BasicLockable の要件を満たさなければなりません

[編集] メンバ型

定義
mutex_type Mutex

[編集] メンバ関数

unique_lock を構築し、オプションで指定されたミューテックスをロックします
(パブリックメンバ関数) [edit]
所有権を持っている場合は、紐付けられているミューテックスのロックを解除します
(パブリックメンバ関数) [edit]
所有権を持っている場合は、紐付けられているミューテックスのロックを解除し、別の unique_lock から所有権を取得します
(パブリックメンバ関数) [edit]
ロック
紐付けられているミューテックスをロックします
(パブリックメンバ関数) [edit]
紐付けられているミューテックスのロックを試みます。 ミューテックスが利用可能でなければ戻ります
(パブリックメンバ関数) [edit]
紐付けられている TimedLockable なミューテックスのロックを試みます。 指定された時間ミューテックスが利用可能にならなければ戻ります
(パブリックメンバ関数) [edit]
紐付けられている TimedLockableなミューテックスのロックを試みます。 指定された時点までミューテックスが利用可能にならなければ戻ります
(パブリックメンバ関数) [edit]
紐付けられているミューテックスのロックを解除します
(パブリックメンバ関数) [edit]
変更
別の std::unique_lock と状態を入れ替えます
(パブリックメンバ関数) [edit]
ロックを解除せずにミューテックスとの紐付けを解除します
(パブリックメンバ関数) [edit]
観察
紐付けられているミューテックスを指すポインタを返します
(パブリックメンバ関数) [edit]
紐付けられているミューテックスの所有権を保持しているかどうか調べます
(パブリックメンバ関数) [edit]
紐付けられているミューテックスの所有権を保持しているかどうか調べます
(パブリックメンバ関数) [edit]

[編集] 非メンバ関数

unique_lock に対する std::swap の特殊化
(関数テンプレート) [edit]

[編集]

#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

[編集] 関連項目

厳密なスコープベースのミューテックス所有権のラッパーを実装します
(クラステンプレート) [edit]
複数のミューテックスに対するデッドロック回避機能付きの RAII ラッパー
(クラステンプレート) [edit]