Skip to content

Latest commit

 

History

History
117 lines (88 loc) · 5.45 KB

shared_lock.md

File metadata and controls

117 lines (88 loc) · 5.45 KB

shared_lock

  • shared_mutex[meta header]
  • std[meta namespace]
  • class template[meta id-type]
  • cpp14[meta cpp]
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;
}
  • std::shared_lock[color ff0000]
  • std::shared_timed_mutex[link /reference/shared_mutex/shared_timed_mutex.md]

出力

0

バージョン

言語

  • C++14

処理系

参照

関連項目