AM Daemon ライブラリリファレンス
Mutex.h
[詳解]
1 /// @file
2 /// @brief プロセス間およびスレッド間で排他制御を行うためのクラス Mutex のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_UTIL_MUTEX_H
7 #define AMDAEMON_UTIL_MUTEX_H
8 
9 #include "amdaemon/env.h"
10 
11 #include <memory>
12 
13 namespace amdaemon
14 {
15 namespace util
16 {
17 /// @addtogroup g_util
18 /// @{
19 
20  /// @brief プロセス間およびスレッド間で排他制御を行うためのクラス。
21  ///
22  /// 再帰的なロック取得を許可しており、同一プロセスかつ同一スレッドであればメンバ関数
23  /// #lock および #try_lock によるロック取得をブロックなしで何度でも行うことができる。
24  /// ただし、ロック取得した回数と同じ回数だけメンバ関数 #unlock を呼び出す必要がある。
25  ///
26  /// ロック関係のメンバ関数名はC++11のミューテクスインタフェースに準拠する。
27  /// これにより std::lock_guard<Mutex>, std::unique_lock<Mutex> 等の利用が可能となる。
28  /// 細かな制御を行う場合を除き、それらロック管理クラスの利用が推奨される。
29  ///
30  /// @code
31  /// #include "amdaemon/util/Mutex.h"
32  /// #include <mutex>
33  ///
34  /// static amdaemon::util::Mutex mutex(L"sample");
35  ///
36  /// void funcChild();
37  ///
38  /// void funcParent()
39  /// {
40  /// // std::lock_guard, std::unique_lock の利用を推奨。
41  /// // 定義時にロック取得され、スコープを抜ける際にロック開放される。
42  /// std::lock_guard<amdaemon::util::Mutex> lock(mutex);
43  ///
44  /// // ロックを行う別の関数を呼び出してみる
45  /// funcChild();
46  /// }
47  ///
48  /// void funcChild()
49  /// {
50  /// // 同一プロセスかつ同一スレッドならば再帰的なロックが可能。
51  /// std::lock_guard<amdaemon::util::Mutex> lock(mutex);
52  ///
53  /// // do something...
54  /// }
55  /// @endcode
56  ///
57  /// 多重起動防止には std::unique_lock<Mutex> と std::try_to_lock を用いるとよい。
58  ///
59  /// @code
60  /// #include "amdaemon/util/Mutex.h"
61  /// #include <mutex>
62  ///
63  /// int main(int, char**)
64  /// {
65  /// using amdaemon::util::Mutex;
66  ///
67  /// Mutex multiBootMutex("my_app");
68  /// std::unique_lock<Mutex> multiBootLock(multiBootMutex, std::try_to_lock);
69  ///
70  /// if (!multiBootLock)
71  /// {
72  /// // 多重起動した時の処理
73  /// }
74  /// else
75  /// {
76  /// // 通常時の処理
77  /// }
78  ///
79  /// return 0;
80  /// }
81  /// @endcode
82  class Mutex
83  {
84  public:
85  /// @brief コンストラクタ。
86  /// @param[in] name ミューテクス名。 nullptr ならば名前無し。
87  explicit Mutex(const wchar_t* name = nullptr);
88 
89  /// @brief ムーブコンストラクタ。
90  /// @param[in] src ムーブ元。ムーブ後は無効値となる。
91  ///
92  /// 引数 src がロックを取得中であっても構わずムーブする。
93  /// その場合、ロックの開放はムーブ先のインスタンスに対して行う必要がある。
94  Mutex(Mutex&& src);
95 
96  /// @brief デストラクタ。
97  ///
98  /// ロックが開放されていない場合、開放処理が行われる。
99  /// 再帰的にロックを取得していた場合でもすべて開放されるが、
100  /// このインスタンスでロックを取得した回数を超えて開放処理が行われることはない。
101  ‾Mutex();
102 
103  /// @brief ムーブ代入演算子。
104  /// @param[in] r ムーブ元となる右辺値。ムーブ後は無効値となる。
105  /// @return 自身の参照。
106  ///
107  /// 引数 r がロックを取得中であっても構わずムーブする。
108  /// その場合、ロックの開放はムーブ先のインスタンスに対して行う必要がある。
109  Mutex& operator=(Mutex&& r);
110 
111  /// @brief ミューテクスが有効値であるか否かを取得する。
112  /// @retval true 有効値である場合。
113  /// @retval false 無効値である場合。
114  ///
115  /// コンストラクタでの初期化に失敗した場合や、ムーブ済みの場合に false を返す。
116  /// 無効値である場合、ロック関係のメンバ関数は何も行わずに失敗する。
117  bool valid() const;
118 
119  /// @brief ロックを取得する。取得できるまでブロックする。
120  /// @retval true ロックを取得できた場合。
121  /// @retval false 無効値である等の理由でロックを取得できなかった場合。
122  bool lock();
123 
124  /// @brief ロックの取得を試行する。取得できなければ即座に false を返す。
125  /// @retval true ロックを取得できた場合。
126  /// @retval false 既にロック取得されている等の理由でロックを取得できなかった場合。
127  bool try_lock();
128 
129  /// @brief ロックを開放する。
130  /// @retval true ロックを開放できた場合。
131  /// @retval false 既に開放済み等の理由でロックを開放できなかった場合。
132  bool unlock();
133 
134  private:
135  class Impl;
136 
137  /// pimpl インスタンス。
138  std::unique_ptr<Impl> _impl;
139 
140  private:
141  // コピー禁止
142  Mutex(const Mutex&); // 宣言のみ
143  Mutex& operator=(const Mutex&); // 宣言のみ
144  };
145 
146 /// @}
147 } // namespace util
148 } // namespace amdaemon
149 
150 #endif // AMDAEMON_UTIL_MUTEX_H
‾Mutex()
デストラクタ。
Daemonライブラリの環境定義を行うヘッダ。
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
bool valid() const
ミューテクスが有効値であるか否かを取得する。
bool unlock()
ロックを開放する。
Mutex(const wchar_t *name=nullptr)
コンストラクタ。
プロセス間およびスレッド間で排他制御を行うためのクラス。
Definition: Mutex.h:82
bool lock()
ロックを取得する。取得できるまでブロックする。
bool try_lock()
ロックの取得を試行する。取得できなければ即座に false を返す。
Mutex & operator=(Mutex &&r)
ムーブ代入演算子。