書き込み時に reader lock を取るテクニック

昔、データを書く時に reader lock を取って、読み時に writer lock を取るワザがある、っていうのを聞いたのを覚えていて、詳細を忘れてたんですが、最近思い出す機会があったので書いておきます。

thread local storage を使って各スレッドにあるキャッシュなんかだと、当然読み書きする時にロックはいらないわけです。ただ、例えばダッシュボードの URL にアクセスされた時にキャッシュの使ってるメモリの総量が知りたいなど、 worker たちを管理しているスレッドが、各スレッドのキャッシュの状態全てにアクセスしたい、なんてことがあったりします。

こういう時に、普通に lock を取ってしまうと、 thread local storage を使って lock しなくて良いようにしてあるメリットが失われてしまう、と、そういう時に使うワザっぽいです。

具体的には、各 worker がそのキャッシュを読み書きする時は reader lock を取ります。 reader lock だから、各 worker は同時にガンガン読み書きしますが、 thread local storage で分離してあるので問題無い。

で、 worker を管理しているスレッドが、全スレッドの状態を取得する時に、読み込み目的にも関わらず、 writer lock を取ります。すると、うまいことに、全ての worker が働きやめるのを待ってから状態を取る感じになってくれます。

ついでに、この rwlock が glibc のデフォルトのままだと reader が忙しいとダッシュボードがなかなか表示されない、みたいなことがあると思われるので、 PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP を使っておくと良いやもです。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h