pthread_rwlock_timedrdlock(3C) 関数は、pthread_rwlock_rdlock() 関数と同様に、rwlock が参照する読み取り/書き込みロックに読み取りロックを適用します。
#include <pthread.h> #include <time.h> int pthread_rwlock_timedrdlock(pthread_rwlock_t *restrict rwlock, const struct timespec *restrict abs_timeout);
ほかのスレッドによるロック解除を待たなければロックを獲得できない場合、この待機は、指定されたタイムアウトの期限が切れると終了します。タイムアウトの期限が切れるのは、abs_timeout で指定された絶対時間 (CLOCK_REALTIME クロックで測定される) が経過した場合 (つまり、そのクロックの値が abs_timeout に等しくなるか、超えた場合)、または呼び出し時に abs_timeout で指定された絶対時間がすでに過ぎている場合です。
タイムアウトの解像度は、CLOCK_REALTIME クロックの解像度です。timespec データ型は、<time.h> ヘッダーで定義されています。ロックをただちに獲得できる場合は、この関数がタイムアウトで失敗することはありません。ロックをただちに獲得できた場合は、タイムアウトパラメータの妥当性を検査する必要はありません。
pthread_rwlock_timedrdlock() の呼び出しによって読み取り/書き込みロックでブロックされているスレッドに、シグナルハンドラを実行させるシグナルが送信された場合、このスレッドはシグナルハンドラから復帰すると、中断がなかったかのようにロックの待機を再開します。
呼び出しスレッドは、呼び出し時に rwlock に書き込みロックを保持しているとデッドロックに陥る可能性があります。
pthread_rwlock_reltimedrdlock_np() 関数は、タイムアウトが相対時間間隔として指定される点を除いて、pthread_rwlock_timedrdlock() 関数と同じ動作をします。
正常に終了して、rwlock が参照する読み取り/書き込みロックオブジェクトに対する書き込みロックが獲得された場合、0 を返します。それ以外の戻り値は、エラーが発生したことを示します。
ETIMEDOUT
説明:指定されたタイムアウトの期限が切れる前にロックを獲得できませんでした。
EAGAIN
説明:ロックの読み取りロックの最大数を超えるため、読み取りロックを獲得できません。
EDEADLK
説明:呼び出しスレッドは、rwlock をすでに保持しています。
EINVAL
説明:rwlock で指定された値が初期化された読み取り/書き込みロックオブジェクトを表していないか、タイムアウトのナノ秒の値が 0 未満または 10 億以上です。