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を書かない場合は、予期せぬインデントに注意すべし。