namespace std {
template <class Mutex>
class shared_lock;
}
概要
shared_lock
は、共有ミューテックスのlock_shared()
/unlock_shared()
処理を、コンストラクタとデストラクタで確実に実行するためのクラスである。
このクラスは、排他ロックを自動的に手放すlock_guard
クラス、unique_lock
クラスと組み合わせて使用する。
- 排他ロック(書き込みロック、
lock()
/unlock()
)を自動的に手放すためにlock_guard
クラス、unique_lock
クラスを使用する。 - 共有ロック(読み込みロック、
lock_shared()
/unlock_shared()
)を自動的に手放すために、このクラスを使用する。
このクラスは、メンバ変数で保持しているミューテックスオブジェクトを、メンバ関数のスコープでロック取得し、手放すというようにして使用する。この手法は、Scoped Locking Patternとして知られている。
テンプレートパラメータMutex
は、lock_shared()
/unlock_shared()
メンバ関数を持つあらゆるミューテックスクラスを扱うためのものである。ミューテックス型をパラメータ化するScoped Locking手法は、Strategized Locking Patternとして知られている。
メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++14 |
(destructor) |
デストラクタ | C++14 |
operator= |
代入演算子 | C++14 |
lock |
共有ロックを取得する | C++14 |
try_lock |
共有ロックの取得を試みる | C++14 |
try_lock_for |
タイムアウトする相対時間を指定して共有ロックの取得を試みる | C++14 |
try_lock_until |
タイムアウトする絶対時間を指定して共有ロックの取得を試みる | C++14 |
unlock |
共有ロックを手放す | C++14 |
swap |
他のshared_lock オブジェクトと値を入れ替える |
C++14 |
release |
ミューテックスの所有権を放棄する | C++14 |
owns_lock |
ロックを取得しているかを判定する | C++14 |
operator bool |
ロックを取得しているかを判定する | C++14 |
mutex |
所有しているミューテックスオブジェクトを取得する | C++14 |
メンバ型
名前 | 説明 | 対応バージョン |
---|---|---|
mutex_type |
ミューテックス型Mutex |
C++14 |
非メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
swap |
2つのshared_lock オブジェクトを入れ替える |
C++14 |
例
#include <iostream>
#include <shared_mutex>
class X {
mutable std::shared_timed_mutex mutex_;
int value_ = 0;
public:
int read_access() const
{
// lockのコンストラクタで、自動的にmutex_.lock_shared()を呼び出す
std::shared_lock<std::shared_timed_mutex> lock(mutex_);
return value_;
} // lockのデストラクタで、自動的にmutex_.unlock_shared()を呼び出す
};
int main()
{
X x;
int value = x.read_access();
std::cout << value << std::endl;
}
23
#include <iostream>
#include <shared_mutex>
class X {
mutable std::shared_timed_mutex mutex_;
int value_ = 0;
public:
int read_access() const
{
// lockのコンストラクタで、自動的にmutex_.lock_shared()を呼び出す
std::shared_lock<std::shared_timed_mutex> lock(mutex_);
return value_;
} // lockのデストラクタで、自動的にmutex_.unlock_shared()を呼び出す
};
int main()
{
X x;
出力
0
バージョン
言語
- C++14
処理系
- Clang: 3.4 ✅
- GCC: 4.9 ✅
- ICC: ??
- Visual C++: 2015 ✅
参照
- Readers–writer lock - Wikipedia
- N3427 Shared locking in C++
- N3568 Shared locking in C++ (Revision 1)
- N3659 Shared locking in C++ (Revision 2)
- N3891 A proposal to rename
shared_mutex
toshared_timed_mutex
関連項目
shared_timed_mutex
: 共有ミューテックスクラスlock_guard
: 排他ロックを自動的に手放すunique_lock
: 排他ロックを自動的に手放す