Namespaces
Variants

std::unique_lock<Mutex>:: 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
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
unique_lock ( ) noexcept ;
(1) (C++11以降)
unique_lock ( unique_lock && other ) noexcept ;
(2) (C++11以降)
explicit unique_lock ( mutex_type & m ) ;
(3) (C++11以降)
unique_lock ( mutex_type & m, std:: defer_lock_t t ) noexcept ;
(4) (C++11以降)
unique_lock ( mutex_type & m, std:: try_to_lock_t t ) ;
(5) (C++11以降)
unique_lock ( mutex_type & m, std:: adopt_lock_t t ) ;
(6) (C++11以降)
template < class Rep, class Period >

unique_lock ( mutex_type & m,

const std:: chrono :: duration < Rep, Period > & timeout_duration ) ;
(7) (C++11以降)
template < class Clock, class Duration >

unique_lock ( mutex_type & m,

const std:: chrono :: time_point < Clock, Duration > & timeout_time ) ;
(8) (C++11以降)

unique_lock を構築し、オプションで指定されたミューテックスをロックします。

1) 関連付けられたミューテックスのない unique_lock を構築します。
2) ムーブコンストラクタ。 unique_lock other の内容で初期化します。 other は関連付けられたミューテックスを持たない状態になります。
3-8) 関連付けられたミューテックスとして unique_lock を構築します。さらに:
3) 関連付けられたミューテックスをロックします。これは m. lock ( ) を呼び出すことで行われます。
4) 関連付けられたミューテックスをロックしません。
5) ブロッキングせずに関連付けられたミューテックスのロックを試みます。これは m. try_lock ( ) を呼び出すことで実現されます。 Mutex Lockable を満たさない場合、動作は未定義です。
6) 呼び出しスレッドが既に非共有ロック(すなわち、 lock try_lock try_lock_for または try_lock_until によって取得されたロック)を m に対して保持していることを前提とします。そうでない場合、動作は未定義です。
7) 関連するミューテックスをロックしようと試みます。これは m. try_lock_for ( timeout_duration ) を呼び出すことで行われます。指定された timeout_duration が経過するか、ロックが取得されるかのいずれか早い方までブロックします。 timeout_duration よりも長くブロックする可能性があります。 Mutex TimedLockable を満たさない場合、動作は未定義です。
8) 関連するミューテックスをロックしようと試みます。これは m. try_lock_until ( timeout_time ) を呼び出すことで行われます。指定された timeout_time に達するかロックが取得されるか、いずれか早い方までブロックします。 timeout_time に達するよりも長くブロックする可能性があります。 Mutex TimedLockable を満たさない場合、動作は未定義です。

パラメータ

other - 状態を初期化するための別の unique_lock
m - ロックに関連付け、オプションで所有権を取得するミューテックス
t - 異なるロック戦略を持つコンストラクタを選択するために使用されるタグパラメータ
timeout_duration - ブロックする最大時間
timeout_time - ブロックする最大時間ポイント

#include <iostream>
#include <mutex>
#include <thread>
#include <utility>
#include <vector>
std::mutex m_a, m_b, m_c;
int a, b, c = 1;
void update()
{
    {   // 注: std::lock_guard または atomic<int> を代わりに使用可能
        std::unique_lock<std::mutex> lk(m_a);
        ++a;
    }
    {   // 注: 詳細と代替案については std::lock と std::scoped_lock を参照
        std::unique_lock<std::mutex> lk_b(m_b, std::defer_lock);
        std::unique_lock<std::mutex> lk_c(m_c, std::defer_lock);
        std::lock(lk_b, lk_c);
        b = std::exchange(c, b + c);
    }
}
int main()
{
    std::vector<std::thread> threads;
    for (unsigned i = 0; i < 12; ++i)
        threads.emplace_back(update);
    for (auto& i : threads)
        i.join();
    std::cout << a << "番目と " << a + 1 << "番目のフィボナッチ数: "
              << b << " と " << c << '\n';
}

出力:

12番目と13番目のフィボナッチ数: 144 と 233