std::shared_lock<Mutex>::shared_lock
提供: cppreference.com
<tbody>
</tbody>
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, const std::chrono::duration<Rep,Period>& timeout_duration ); |
(7) | (C++14以上) |
template< class Clock, class Duration > shared_lock( mutex_type& m, const std::chrono::time_point<Clock,Duration>& timeout_time ); |
(8) | (C++14以上) |
shared_lock を構築し、オプションで指定されたミューテックスをロックします。
1) 紐付けられるミューテックスのない
shared_lock を構築します。2) ムーブコンストラクタ。
other の内容を持つ shared_lock を初期化します。 other は紐付けられているミューテックスのない状態になります。3-8) 紐付けられるミューテックスとして
m を持つ shared_lock を構築します。 さらに、3)
m.lock_shared() を呼ぶことによって、紐付けられているミューテックスを共有モードでロックします。 このスレッドがそのミューテックスをいずれかのモードですでに所有している場合、動作は未定義です。4) 紐付けられているミューテックスをロックしません。
5)
m.try_lock_shared() を呼ぶことによって、ブロックせずに紐付けられているミューテックスの共有モードでのロックを試みます。 このスレッドがそのミューテックスをいずれかのモードですでに所有している場合、動作は未定義です。6) 呼び出し元スレッドが
m をすでに共有モードで所有していると仮定します。7)
m.try_lock_shared_until(timeout_duration) を呼ぶことによって、紐付けられているミューテックスの共有モードでのロックを試みます。 指定された timeout_duration が経過するか、ロックを取得するか、どちらかが先に発生するまでブロックします。 timeout_duration より長くブロックする可能性があります。 このスレッドがそのミューテックスをいずれかのモードですでに所有している場合、動作は未定義です。8)
m.try_lock_shared_for(timeout_time) を呼ぶことによって、紐付けられているミューテックスの共有モードでのロックを試みます。 指定された timeout_time に達するか、ロックを取得するか、どちらかが先に発生するまでブロックします。 timeout_time に達するまでにより長くブロックする可能性があります。 このスレッドがそのミューテックスをいずれかのモードですでに所有している場合、動作は未定義です。引数
| other | - | 状態を初期化するための別の shared_lock
|
| m | - | ロックと紐付けるミューテックス |
| t | - | 異なるロック戦略を持つコンストラクを選択するために使用するタグ引数 |
| timeout_duration | - | ブロックする最大時間 |
| timeout_time | - | ブロックする最大時点 |
例
Run this code
#include <shared_mutex>
#include <iostream>
#include <thread>
#include <chrono>
std::shared_timed_mutex m;
int i = 10;
void read()
{
// both the threads get access to the integer i
std::shared_lock<std::shared_timed_mutex> slk(m);
std::cout << "read i as " << i << "...\n"; // this is not synchronized
std::this_thread::sleep_for(std::chrono::milliseconds(10));
std::cout << "woke up...\n";
}
int main()
{
std::thread r1(read);
std::thread r2(read);
r1.join();
r2.join();
return 0;
}