EN JA
PTHREAD_RWLOCK_RDLOCK(3)
PTHREAD_RWLOCK_RDLOCK(3) FreeBSD Library Functions Manual PTHREAD_RWLOCK_RDLOCK(3)

名称

pthread_rwlock_rdlock, pthread_rwlock_tryrdlock読み込みのための読み込み/書み込みロックを獲得する

ライブラリ

POSIX Threads Library (libpthread, -lpthread)

書式

#include < pthread.h>

int
pthread_rwlock_rdlock( pthread_rwlock_t *lock);

int
pthread_rwlock_tryrdlock( pthread_rwlock_t *lock);

解説

pthread_rwlock_rdlock() 関数は、 lock が書き込みのために現在保持されず、書き込み側のスレッドが現在そのロックでブロックされていないならば、 lock で読み込みロックを獲得しま。読み込みロックが直ちに獲得することができないなら、呼び出しているスレッドは、ロックを獲得することができるまで、ブロックします。

pthread_rwlock_tryrdlock() 関数は、同じアクションを実行しますが、ロックを直ちに取得することができないなら (すなわち、ロックが書き込みのために保持されているか、またはウェート (待つ) している書き込み側がある)、ブロックしません。

1 つのスレッドは、複数の同時に起こる読み込みロックを保持できます。そうであるなら、 pthread_rwlock_unlock() は、取得されたロック毎に一度呼び出されなければなりません。

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

実装に関する注

書き込み側の飢餓状態を防ぐために、書き込み側は、読み込み側より優先されます。

戻り値

成功したなら、 pthread_rwlock_rdlock() と pthread_rwlock_tryrdlock() 関数は、0 を返します。そうでなければ、エラー番号がエラーを示すために返されます。

エラー

pthread_rwlock_tryrdlock() 関数は、次の場合に失敗します:
[ EBUSY]
書み込み側がロックを保持しているか、またはブロックされていたので、ロックが獲得できませんでした。

pthread_rwlock_rdlock() と pthread_rwlock_tryrdlock() 関数は、次の場合に失敗します:

[ EAGAIN]
lock に対する読み込みロックの最大数を既に越えているので、ロックが獲得できませんでした。
[ EDEADLK]
現在のスレッドが既に書み込みのための lock を所有しています。
[ EINVAL]
lock によって指定された値が無効です。
[ ENOMEM]
(静的に初期化されたロックだけに適用される) ロックを初期化するために存在するメモリが不足しています。

規格

pthread_rwlock_rdlock() と pthread_rwlock_tryrdlock() 関数は、 Version 2 of the Single UNIX Specification (“SUSv2”) に適合するはずです。

歴史

pthread_rwlock_rdlock() 関数は、 FreeBSD 3.0 ではじめて登場しました。
August 4, 1998 FreeBSD