Linuxスレッド同期読み書きロックrwlock


詳細
読み書きロックはmutexよりも適用性が高く、複数のスレッドが読み書きモードの読み書きロックを同時に占有することができますが、1つのスレッドだけが書き込みモードの読み書きロックを占有することができます.
1.読み書きロックが書き込みロック状態である場合、このロックがロック解除される前に、このロックをロックしようとするすべてのスレッドがブロックされる.
2.リード・ライト・ロックがリード・ロック状態にある場合、リード・モードでロックしようとするすべてのスレッドにアクセス権が与えられるが、ライト・モードで足かせをかけるスレッドはブロックされる.
3.リード・ライト・ロックがリード・モード・ロック状態にある場合、別のスレッドがライト・モードでロックしようとすると、リード・ライト・ロックは通常、後続のリード・モード・ロック要求をブロックし、リード・モード・ロックの長期的な占有を回避し、待機するライト・モード・ロック要求の長期的なブロックを回避することができる.
このようなロックは、データ構造の読み取り回数が書き込み回数よりも多い場合に適用される.
APIインタフェースの説明:
1)初期化と破棄
#include 
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

成功すると0を返し、エラーが発生するとエラー番号を返す.
2)リードロックとライトロック
ロックを取得する2つの関数はブロック操作です
#include 
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

成功すると0を返し、エラーが発生するとエラー番号を返す.
3)非ブロックでリードロックとライトロックを獲得する
非ブロックの取得ロック動作は、取得可能であれば0を返す、そうでなければエラーのEBUSYを返す.
#include 
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

成功すると0を返し、エラーが発生するとエラー番号を返す.
変換元:http://www.cnblogs.com/caosiyang/archive/2011/11/25/2262980.html