名前空間
変種
操作

std::unique_lock<Mutex>::unique_lock

提供: cppreference.com
< cpp‎ | thread‎ | unique lock
 
 
スレッドサポートライブラリ
スレッド
(C++11)
(C++20)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
相互排他
(C++11)
汎用ロック管理
(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)
 
 
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) ムーブコンストラクタ。 other の内容を持つ unique_lock を初期化します。 other は紐付けられているミューテックスがなくなります。
3-8) 紐付けられるミューテックスとして m を持つ unique_lock を構築します。 さらに、
3) m.lock() を呼ぶことによって、紐紐付けられているミューテックスをロックします。 そのミューテックスが再帰である場合を除き、現在のスレッドがそのミューテックスをすでに所有している場合、動作は未定義です。
4) 紐付けられているミューテックスをロックしません。
5) m.try_lock() を呼ぶことによって、ブロックせずに紐付けられているミューテックスのロックを試みます。 そのミューテックスが再帰である場合を除き、現在のスレッドがそのミューテックスをすでに所有している場合、動作は未定義です。
6) 呼び出し元スレッドがすでに m を所有していると仮定します。
7) m.try_lock_for(timeout_duration) を呼ぶことによって、紐付けられているミューテックスのロックを試みます。 指定された timeout_duration が経過するか、ロックを取得するか、どちらかが先に発生するまでブロックします。 timeout_duration より長くブロックする可能性があります。
8) m.try_lock_until(timeout_time) を呼ぶことによって、紐付けられているミューテックスのロックを試みます。 指定された timeout_time に達するか、ロックを取得するか、どちらかが先に発生するまでブロックします。 timeout_time に達するまでよりも長くブロックする可能性もあります。

[編集] 引数

other - 状態を初期化するための別の unique_lock
m - ロックに紐付けるミューテックス
t - 異なるロック戦略を持つコンストラクタを選択するために使用するタグ引数
timeout_duration - ブロックする最大時間
timeout_time - ブロックする最大時点

[編集] 例外

[編集]

#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
std::mutex m_a, m_b, m_c;
int a, b, c = 1;
void update()
{
    {   // Note: std::lock_guard or atomic<int> can be used instead
        std::unique_lock<std::mutex> lk(m_a);
        a++;
    }
 
    { // Note: see std::lock and std::scoped_lock for details and alternatives
      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 << "'th and " << a+1 << "'th Fibonacci numbers: "
            << b << " and " << c << '\n';
}

出力:

12'th and 13'th Fibonacci numbers: 144 and 233