http://www.soum.co.jp/misc/tatuhiko/multi-thread/index.html
とかいう記述をみつけたのひとこと。
答えはLSBに書いてある
http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libpthread-pthread-rwlockattr-getkind-np-1.html
コードだとこのへん。PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NPのときだけ、flagsが1になってるのがわかると思う
元々、read/write lockで write が recursiveって変なのでなかったことになってる。
READ_RWLOCK_PREFER_READER_NPがデフォルト値のようなのです。字面から書き込みを優先しそうな、PTHREAD_RWLOCK_PREFER_WRITER_NPを設定して、再度確認してみます。しかし、なぜかこれを設定しても、書きこみロック待ちのスレッドがあっても、読み込みロックが取得できてしまします。意味がわかりません。
試しに PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP を指定して試してみると、書きこみロック待ちのスレッドがある場合にうまい具合に読み込みロックがブロックしてくれました。
とかいう記述をみつけたのひとこと。
答えはLSBに書いてある
http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libpthread-pthread-rwlockattr-getkind-np-1.html
Notes
Setting the value read-write lock kind to PTHREAD_RWLOCK_PREFER_WRITER_NP, results in the same behavior as setting the value to PTHREAD_RWLOCK_PREFER_READER_NP. As long as a reader thread holds the lock the thread holding a write lock will be starved. Setting the kind value to PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, allows the writer to run. However, the writer may not be recursive as is implied by the name.
コードだとこのへん。PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NPのときだけ、flagsが1になってるのがわかると思う
int
__pthread_rwlock_init (rwlock, attr)
pthread_rwlock_t *rwlock;
const pthread_rwlockattr_t *attr;
{
const struct pthread_rwlockattr *iattr;
iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_rwlockattr;
memset (rwlock, '\0', sizeof (*rwlock));
rwlock->__data.__flags
= iattr->lockkind == PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP;
元々、read/write lockで write が recursiveって変なのでなかったことになってる。
コメント