boostの[shared|upgrade|upgrade_to_unique]_lockの話

良いオチが付いたので
13
Hajime Hoshi @hajimehoshi

Boost って Read-Write Lock ないんだ…

2010-12-14 01:27:09
Hajime Hoshi @hajimehoshi

boost::shared_mutex 使えばいいんですかね。

2010-12-14 01:30:50
Hajime Hoshi @hajimehoshi

upgrade_lock と upgrade_unique_lock の違いはなんだ:http://bit.ly/fmvM3l

2010-12-14 01:33:09
くまぎ @kumagi

@hajimehoshi upgrade_lockはshared_lockを獲得しているスレッドが他に居ても獲得可能。upgrade_lockからupgrade_unique_lockに昇格する際にshared_lockが全部開放されるまで待たされる。と記憶。

2010-12-14 01:46:54
Hajime Hoshi @hajimehoshi

@kumagi upgrade_to_unique_lock は upgrade_lock を取ってないと取れない、という認識であってますか?

2010-12-14 01:47:36
くまぎ @kumagi

@hajimehoshi upgrade_*はどっちもwrite_lockなので、upgrade_lockは複数のスレッドから取得できません。また、upgrade_to_unique_lockのコンストラクタでupgrade_lockを要求します。

2010-12-14 01:48:56
Hajime Hoshi @hajimehoshi

@kumagi なるほどー。一般的な Reader-Writer パターンよりもきめ細かい処理ができるんですね。

2010-12-14 01:53:52
くまぎ @kumagi

@hajimehoshi 「writerはチェックするだけで時々書き込みを行わないかもしれない」場合に並列性が高まりそうですが、毎回必ず書き込みを行う場合はあんまり恩恵がないかもです。

2010-12-14 01:57:05
Hajime Hoshi @hajimehoshi

upgrade_lock かかってから upgrade_to_unique_lock がかかる直前までの範囲は、 writer 一つしか入れない。また、他で reader が動いているかもしれない。

2010-12-14 01:55:26
Hajime Hoshi @hajimehoshi

んご、こんなバグにひっかかった: http://bit.ly/fcdayb

2010-12-14 02:18:55
SKS rep @repeatedly

upgrade_lockからupgrade_unique_lockへと昇格させるのって,どういう時に使うの?

2010-12-14 01:56:26
くまぎ @kumagi

@repeatedly 実際に書き込みを行うために本格的にreaderを締め出したくなった時に使います。upgrade_lockだけだとまだ他にreaderが居る場合があるので。

2010-12-14 02:01:53
SKS rep @repeatedly

@kumagi あれ,でもwrite lockってことは,書き込みの時は全ての操作をロックするよね?readerはそこで止まるんじゃないのん?

2010-12-14 02:04:12
SKS rep @repeatedly

あーなるほど,upgrade_lock同士が共存不可なのか.どうやって他のupgrade_lockの問い合わせを制御するのかと.

2010-12-14 02:28:12
SKS rep @repeatedly

upgrade_to_unique_lockってのは,それ以降のlockの獲得を禁止して,今まで獲得されたロックが解放されるまでブロック?

2010-12-14 02:31:00
くまぎ @kumagi

@repeatedly templateでmutexがプラガブルになってるのでそこの実装は使ってるmutexによりますが、boost::shared_mutexを使う限りはupgrade_to_unique_lockの確保待ちだとそれ以上shared_lockは取れなさそうです。

2010-12-14 02:44:08
SKS rep @repeatedly

結論: メッセージパッシング使え

2010-12-14 02:46:21