名前空間
変種
操作

std::unique_lock

From cppreference.com
< cpp‎ | thread
 
 
並行性サポートライブラリ
スレッド
(C++11)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
協調的なキャンセル
排他制御
(C++11)
汎用ロック管理
(C++11)
(C++11)
unique_lock
(C++11)
(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
 
ヘッダ <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を構築します。オプションで、指定されたミューテックスをロックします(つまり、所有権を取得します)。
(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 アルゴリズムを特殊化する
(関数テンプレート) [編集]

[編集]

#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)
指定されたミューテックスをロックし、いずれかが利用できない場合はブロックする
(関数テンプレート) [編集]
厳密なスコープベースのミューテックス所有権ラッパーを実装する
(クラステンプレート) [編集]
デッドロックを回避する、複数のミューテックス用のRAIIラッパー
(クラステンプレート) [編集]
(C++11)
基本的な相互排他機能を提供する
(クラス) [編集]
English 日本語 中文(简体) 中文(繁體)