Namespaces
Variants

std:: unique_lock

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
(C++11)
(C++11)
unique_lock
(C++11)
(C++11)
(C++11)
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
定義先ヘッダ <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)

非メンバー関数

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)
厳密なスコープベースのミューテックス所有権ラッパーを実装する
(クラステンプレート)
複数のミューテックスに対するデッドロック回避RAIIラッパー
(クラステンプレート)
(C++11)
基本的な相互排他機能を提供する
(クラス)