3.1.3. pfi::concurrent::lock¶
3.1.3.1. 概要¶
マルチスレッドで同期を取るためのライブラリ
3.1.3.2. 使い方¶
3.1.3.2.1. lockaleなクラス¶
lock() と unlock() ができるクラスである。 次のクラスが用意されている。
mutex 普通のミューテックス。
r_mutex 再帰的にロックができるミューテックス。
rw_mutex read/write ロックができるミューテックス。さらに制限時間付きロックもできる。 read_lock(), write_lock()で呼び分ける。 unlock()はどちらでも同じ。 lock()はread_lock()を呼びだす。
3.1.3.2.2. scoped_lock¶
lockableなクラスを受け取るRAIIクラス。 コンストラクタでロックをかけて、 デストラクタでアンロックするクラスである。
mutex m;
{
scoped_lock lk(m);
...
}
3.1.3.2.3. 便利な書き方¶
synchronized
java風にブロックロックが書ける。
mutex m;
synchronized(m){
// ここの範囲でロック
}
read/write locker
rw_mutexのロックを便利にする。
rw_mutex m;
{
scoped_lock lk(rlock(m));
// read lock
}
rw_mutex m;
{
scoped_lock lk(wlock(m));
// write lock
}
rw_mutex m;
{
scoped_lock lk(rlock(m, 10));
// 制限時間付き read lock
}
rw_mutex m;
{
scoped_lock lk(wlock(m, 10));
// 制限時間付き write lock
}
もちろんsynchronizedにも渡せる。
rw_mutex m;
synchronized(rlock(m)){
}
synchronizedの実体はifなので、 ロックがかからなかった時の処理を書くことができる。
rw_mutex m;
synchronized(rlock(m, 5)){
}
else{
//
}
elseを書かない場合は、予期せぬインデントに注意すべし。