- shared_mutex[meta header]
- std[meta namespace]
- shared_timed_mutex[meta class]
- function[meta id-type]
- cpp14[meta cpp]
void lock_shared();共有ロックを取得する。
この関数を呼び出したスレッドが、ミューテックスの排他所有権と共有所有権のいずれもを保持していないこと。
この関数を呼び出したスレッドがミューテックスの共有所有権を取得できるまでブロックする。
なし
この関数は、以下のerror conditionを持つsystem_error例外オブジェクトを送出する可能性がある:
operation_not_permitted: スレッドにこの操作を行う権限がないresource_deadlock_would_occur: デッドロックが発生することを検出した(実装依存)device_or_resource_busy: ミューテックスがすでにロックされていて、ブロッキングできない
#include <thread>
#include <shared_mutex>
class X {
mutable std::shared_timed_mutex mtx_;
int value_ = 0;
public:
// メンバ変数value_への書き込みを排他的にする
void add_value(int value)
{
mtx_.lock(); // 排他ロックを取得する
value_ = value;
mtx_.unlock(); // 排他ロックを手放す
}
// メンバ変数value_の値を読み込む
int get_value() const
{
int result = 0;
mtx_.lock_shared(); // 共有ロックを取得する
result = value_;
mtx_.unlock_shared(); // 共有ロックを手放す
return result;
}
};
int main()
{
X x;
std::thread t1([&x]{ x.add_value(1); int value = x.get_value(); });
std::thread t2([&x]{ x.add_value(2); int value = x.get_value(); });
t1.join();
t2.join();
}- lock_shared()[color ff0000]
- lock()[link lock.md]
- unlock()[link unlock.md]
- unlock_shared()[link unlock_shared.md]
- C++14
- Clang: 3.5 [mark verified]
- GCC: 4.9 [mark verified]
- ICC: ??
- Visual C++: 2015 [mark verified]