AM Daemon ライブラリリファレンス
公開メンバ関数 | 全メンバ一覧
amdaemon::util::Mutex クラス

プロセス間およびスレッド間で排他制御を行うためのクラス。 [詳解]

#include <Mutex.h>

公開メンバ関数

 Mutex (const wchar_t *name=nullptr)
 コンストラクタ。 [詳解]
 
 Mutex (Mutex &&src)
 ムーブコンストラクタ。 [詳解]
 
 ‾Mutex ()
 デストラクタ。 [詳解]
 
Mutexoperator= (Mutex &&r)
 ムーブ代入演算子。 [詳解]
 
bool valid () const
 ミューテクスが有効値であるか否かを取得する。 [詳解]
 
bool lock ()
 ロックを取得する。取得できるまでブロックする。 [詳解]
 
bool try_lock ()
 ロックの取得を試行する。取得できなければ即座に false を返す。 [詳解]
 
bool unlock ()
 ロックを開放する。 [詳解]
 

詳解

プロセス間およびスレッド間で排他制御を行うためのクラス。

再帰的なロック取得を許可しており、同一プロセスかつ同一スレッドであればメンバ関数 lock および try_lock によるロック取得をブロックなしで何度でも行うことができる。 ただし、ロック取得した回数と同じ回数だけメンバ関数 unlock を呼び出す必要がある。

ロック関係のメンバ関数名はC++11のミューテクスインタフェースに準拠する。 これにより std::lock_guard<Mutex>, std::unique_lock<Mutex> 等の利用が可能となる。 細かな制御を行う場合を除き、それらロック管理クラスの利用が推奨される。

#include <mutex>
static amdaemon::util::Mutex mutex(L"sample");
void funcChild();
void funcParent()
{
// std::lock_guard, std::unique_lock の利用を推奨。
// 定義時にロック取得され、スコープを抜ける際にロック開放される。
std::lock_guard<amdaemon::util::Mutex> lock(mutex);
// ロックを行う別の関数を呼び出してみる
funcChild();
}
void funcChild()
{
// 同一プロセスかつ同一スレッドならば再帰的なロックが可能。
std::lock_guard<amdaemon::util::Mutex> lock(mutex);
// do something...
}

多重起動防止には std::unique_lock<Mutex> と std::try_to_lock を用いるとよい。

#include <mutex>
int main(int, char**)
{
Mutex multiBootMutex("my_app");
std::unique_lock<Mutex> multiBootLock(multiBootMutex, std::try_to_lock);
if (!multiBootLock)
{
// 多重起動した時の処理
}
else
{
// 通常時の処理
}
return 0;
}

構築子と解体子

amdaemon::util::Mutex::Mutex ( const wchar_t *  name = nullptr)
explicit

コンストラクタ。

引数
[in]nameミューテクス名。 nullptr ならば名前無し。
amdaemon::util::Mutex::Mutex ( Mutex &&  src)

ムーブコンストラクタ。

引数
[in]srcムーブ元。ムーブ後は無効値となる。

引数 src がロックを取得中であっても構わずムーブする。 その場合、ロックの開放はムーブ先のインスタンスに対して行う必要がある。

amdaemon::util::Mutex::‾Mutex ( )

デストラクタ。

ロックが開放されていない場合、開放処理が行われる。 再帰的にロックを取得していた場合でもすべて開放されるが、 このインスタンスでロックを取得した回数を超えて開放処理が行われることはない。

関数詳解

Mutex& amdaemon::util::Mutex::operator= ( Mutex &&  r)

ムーブ代入演算子。

引数
[in]rムーブ元となる右辺値。ムーブ後は無効値となる。
戻り値
自身の参照。

引数 r がロックを取得中であっても構わずムーブする。 その場合、ロックの開放はムーブ先のインスタンスに対して行う必要がある。

bool amdaemon::util::Mutex::valid ( ) const

ミューテクスが有効値であるか否かを取得する。

戻り値
true有効値である場合。
false無効値である場合。

コンストラクタでの初期化に失敗した場合や、ムーブ済みの場合に false を返す。 無効値である場合、ロック関係のメンバ関数は何も行わずに失敗する。

bool amdaemon::util::Mutex::lock ( )

ロックを取得する。取得できるまでブロックする。

戻り値
trueロックを取得できた場合。
false無効値である等の理由でロックを取得できなかった場合。
bool amdaemon::util::Mutex::try_lock ( )

ロックの取得を試行する。取得できなければ即座に false を返す。

戻り値
trueロックを取得できた場合。
false既にロック取得されている等の理由でロックを取得できなかった場合。
bool amdaemon::util::Mutex::unlock ( )

ロックを開放する。

戻り値
trueロックを開放できた場合。
false既に開放済み等の理由でロックを開放できなかった場合。

このクラス詳解は次のファイルから抽出されました: