std::shared_lock<Mutex>:: shared_lock
From cppreference.net
<
cpp
|
thread
|
shared lock
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::shared_lock
| Member functions | ||||
|
shared_lock::shared_lock
|
||||
| Shared locking | ||||
| Modifiers | ||||
| Observers | ||||
| Non-member functions | ||||
|
shared_lock
(
)
noexcept
;
|
(1) | (C++14以降) |
|
shared_lock
(
shared_lock
&&
other
)
noexcept
;
|
(2) | (C++14以降) |
|
explicit
shared_lock
(
mutex_type
&
m
)
;
|
(3) | (C++14以降) |
|
shared_lock
(
mutex_type
&
m,
std::
defer_lock_t
t
)
noexcept
;
|
(4) | (C++14以降) |
|
shared_lock
(
mutex_type
&
m,
std::
try_to_lock_t
t
)
;
|
(5) | (C++14以降) |
|
shared_lock
(
mutex_type
&
m,
std::
adopt_lock_t
t
)
;
|
(6) | (C++14以降) |
|
template
<
class
Rep,
class
Period
>
shared_lock
(
mutex_type
&
m,
|
(7) | (C++14以降) |
|
template
<
class
Clock,
class
Duration
>
shared_lock
(
mutex_type
&
m,
|
(8) | (C++14以降) |
shared_lock
を構築し、オプションで指定されたミューテックスをロックします。
1)
関連付けられたミューテックスのない
shared_lock
を構築します。
2)
ムーブコンストラクタ。
shared_lock
を
other
の内容で初期化します。
other
は関連付けられたミューテックスを持たない状態になります。
3-8)
関連付けられたミューテックスとして
m
を持つ
shared_lock
を構築します。さらに:
3)
関連付けられたミューテックスを共有モードでロックします。これは
m.
lock_shared
(
)
を呼び出すことで行われます。
4)
関連付けられたミューテックスをロックしません。
5)
関連するミューテックスを共有モードでブロックせずにロックしようと試みます。これは
m.
try_lock_shared
(
)
を呼び出すことで行われます。
6)
呼び出しスレッドが既に共有ロック(
lock_shared
、
try_lock_shared
、
try_lock_shared_for
または
try_lock_shared_until
によって取得されたロック)を
m
に対して保持していることを前提とします。そうでない場合の動作は未定義です。
7)
関連するミューテックスを共有モードでロックしようと試みます。これは
m.
try_lock_shared_for
(
timeout_duration
)
を呼び出すことで実現され、指定された
timeout_duration
が経過するかロックが取得されるかのいずれか早い方までブロックします。
timeout_duration
よりも長くブロックする可能性があります。
Mutex
が
SharedTimedLockable
要件を満たさない場合、動作は未定義です。
8)
関連するミューテックスを共有モードでロックしようと試みます。これは
m.
try_lock_shared_until
(
timeout_time
)
を呼び出すことで実現され、指定された
timeout_time
に達するかロックが取得されるまで(いずれか早い方)ブロックします。
timeout_time
に達するよりも長くブロックする可能性があります。
Mutex
が
SharedTimedLockable
要件を満たさない場合、動作は未定義です。
パラメータ
| other | - |
状態を初期化するための別の
shared_lock
|
| m | - | ロックに関連付け、オプションで所有権を取得するミューテックス |
| t | - | 異なるロック戦略を持つコンストラクタを選択するために使用されるタグパラメータ |
| timeout_duration | - | ブロックする最大期間 |
| timeout_time | - | ブロックする最大時間ポイント |
例
このコードを実行
#include <chrono> #include <iostream> #include <shared_mutex> #include <syncstream> #include <thread> std::shared_timed_mutex m; int i = 10; void read_shared_var(int id) { // 両方のスレッドが整数iにアクセス可能 std::shared_lock<std::shared_timed_mutex> slk(m); const int ii = i; // グローバル変数iを読み取り std::osyncstream(std::cout) << '#' << id << " read i as " << ii << "...\n"; std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::osyncstream(std::cout) << '#' << id << " woke up..." << std::endl; } int main() { std::thread r1{read_shared_var, 1}; std::thread r2{read_shared_var, 2}; r1.join(); r2.join(); }
出力例:
#2 read i as 10... #1 read i as 10... #2 woke up... #1 woke up...