std::unique_lock<Mutex>:: unique_lock
From cppreference.net
<
cpp
|
thread
|
unique lock
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::unique_lock
| Member functions | ||||
|
unique_lock::unique_lock
|
||||
| Locking | ||||
| Modifiers | ||||
| Observers | ||||
| Non-member functions | ||||
|
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,
|
(7) | (C++11以降) |
|
template
<
class
Clock,
class
Duration
>
unique_lock
(
mutex_type
&
m,
|
(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