マルチスレッドのプログラミング

pthread_rwlock_rdlock(3THR)


#include <pthread.h>

int  pthread_rwlock_rdlock(pthread_rwlock_t *rwlock );

pthread_rwlock_rdlock(3THR) は、rwlock が参照する読み取り / 書き込みロックに読み取りロックを適用します。書き込みがロックを保持せず、読み取り / 書き込みロックでブロックされている書き込みもない場合は、呼び出しスレッドは読み取りロックを獲得します。書き込みがロックを保持せず、ロック待ちの書き込みがある場合は、呼び出しスレッドが読み取りロックを獲得するかどうかは不定です。書き込みが読み取り / 書き込みロックを保持している場合は、呼び出しスレッドは読み取りロックを獲得しません。読み取りロックが獲得されない場合、呼び出しスレッドは読み取りロックを獲得するまでブロックします。つまり、呼び出しスレッドは、pthread_rwlock_rdlock() から戻り値を取得しません。呼び出し時に、呼び出しスレッドが rwlock に書き込みロックを保持する場合、その結果は不定です。

書き込み側がいつまでもロックを獲得できない事態を避けるために、書き込みが読み取りに優先するように実装できます。たとえば、Solaris スレッドの実装では、書き込みが読み取りに優先します。「rw_rdlock(3THR) 」 を参照してください。

スレッドは、rwlock に複数の並行的な読み取りロックを保持できます。つまり、pthread_rwlock_rdlock() の呼び出しが n 回成功します。この場合、スレッドは同数の読み取りロック解除を行わなければなりません。つまり、pthread_rwlock_unlock()n 回呼び出さなければなりません。

pthread_rwlock_rdlock() が、初期化されていない読み取り / 書き込みロックに対して呼び出された場合、その結果は不定です。

読み取りのための読み取り / 書き込みロックを待っているスレッドにシグナルが送られた場合、スレッドはシグナルハンドラから戻ると、見かけ上割り込みがなかった場合と同様に、読み取りのための読み取り / 書き込みロック待ちを再開します。

戻り値

正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。


EINVAL

attr または rwlock が示す値は無効です。