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

pthread_rwlock_rdlock の構文

#include <pthread.h>

int  pthread_rwlock_rdlock(pthread_rwlock_t *rwlock );

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

書き込み側がいつまでもロックを獲得できない事態を避けるために、書き込みが読み取りに優先するように実装することが許されています。Solaris スレッドの実装では、書き込みが読み取りに優先します。

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

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

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