Silphireの日記: pthread日記(65) - pthread_rwlock_rdlock()
読み込みの為に読み書きロックをロックします
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
pthread_rwlock_rdlock()は、rwlockが参照する読み書きロックに読み込みロックを適用します。pthread_rwlock_rdlock()を呼び出したスレッドは、その読み書きロックが書き込みロックによって保持されていなく、また書き込みロックをかけようとしてブロックしているスレッドが無ければ、ロックする事が出来ます。pthread_rwlock_wrlock()でロックを待っているが、まだロックをかけていないスレッドがある時に、pthread_rwlock_rdlock()を呼び出したスレッドがロックをかけようとした時の動作は規定されていません。書き込みロック中のスレッドがあるなら、pthread_rwlock_rdlock()を呼び出したスレッドはロック出来ないだろう。読み込みロックがかけられなかった時、pthread_rwlock_rdlock()を呼び出したスレッドはロックが獲得出来るまでブロックします(つまり、その間pthread_rwlock_rdlock()の呼び出しから戻ってこないという事です。)。書き込みロックをかけているスレッドがpthread_rwlock_rdlock()を呼び出した結果は未定義です。
実装によっては、書き手が読み手より有利にされます。
スレッドが一度に複数の読み込みロックをrwlockに対して行っても構いません(つまり、正常にpthread_rwlock_rdlock()をn回呼ぶという事です。)。その場合、スレッドは同じ回数分解放しなくてはなりません(つまり、pthread_rwlock_unlock()をn回呼び出さなければならないという事です。)。
初期化されていない読み書きロックに対してロックを行った場合の結果は未定義です。
読み書きロックを読み込みロック待ちでブロックしているスレッドに対してシグナルが配送されてきた場合、シグナルハンドラから戻る時に、スレッドは割り込みが無かったかのように読み書きロックのブロックから復帰します。
pthread_rwlock_rdlock()が成功した時には0を返します。エラーの時はエラーに応じた値を返します。
pthread日記(65) - pthread_rwlock_rdlock() More ログイン