PTHREAD_RWLOCK_RDLOCK(3)

名称
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock - 読取り用の読取り / 書込みロックの獲得

ライブラリ
libc_r

書式
<pthread.h> int pthread_rwlock_rdlock(pthread_rwlock_t *lock) int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock)

解説
pthread_rwlock_rdlock() 関数は、 lock で与えられた、ロックが現在書込み用に保持されておらず、書込みスレッドが 現在そのロックでブロックされていない、読取り用のロックを獲得します。 読取り用のロックをすぐに獲得できない場合には、呼び出しているスレッドは そのロックを獲得できるまでブロックします。

pthread_rwlock_tryrdlock() 関数は、同じ操作を実行しますが、すぐにロックを獲得できない (すなわち、 ロックが書込み用に保持されている、 または待っている書込みスレッドがある) 場合には、ブロックしません。

1 つのスレッドは複数の同時の読取り用ロックを保持することができます。 その場合には、個々の獲得されたのために pthread_rwlock_unlock() が 1 度ずつ呼び出されなければなりません。

呼び出しているスレッドが書込み用のロックを保持している間の、 読取り用のロックの獲得の結果は、未定義です。

実装に関する注
書込み側の飢餓状態を防ぐため、書込み側が読込み側よりも優先されます。

戻り値
問題がない場合は、 pthread_rwlock_rdlock() および pthread_rwlock_tryrdlock() 関数は 0 を返します。 問題がある場合は、そのエラーを示すためにエラー番号が返されます。

関連項目
pthread_rwlock_init(3), pthread_rwlock_trywrlock(3), pthread_rwlock_unlock(3), pthread_rwlock_wrlock(3)

規格
pthread_rwlock_rdlock() および pthread_rwlock_tryrdlock() 関数は、 susv2 に適合しているはずです。

エラー
pthread_rwlock_tryrdlock() 関数は、以下の場合に失敗します。

[EBUSY]
    書込みスレッドがロックを保持している、またはブロックされているため、 ロックを獲得できません。

pthread_rwlock_rdlock() および pthread_rwlock_tryrdlock() 関数は、以下の場合に失敗することがあります。

[EAGAIN]
    lock に対する読取り用のロックの最大数を既に越えているため、 ロックを獲得できません。

[EDEADLK]
    現在のスレッドが既に書込み用の lock を所有しています。

[EINVAL]
    lock によって指定された値が無効です。

[ENOMEM]
    ロック (静的に初期化されたロックのみに適用) の初期化のために 十分なメモリがありません。

歴史
pthread_rwlock_rdlock() 関数は、 FreeBSD 3.0 ではじめて登場しました。