|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 s5 f2 I) ]- O0 ]" x2 ?8 j
1. 特性:6 \! P* [- X8 V5 R' }' | a
/ ^$ `5 v2 g! q 一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性,
. |) \! F/ d) I- l3 k4 c
0 @$ [& ]: I9 _4 g' q( i7 u0 d当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.6 R( A1 ]" C4 `# e- X
当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须阻塞知道所有的线程释放锁.
F" e( h/ E) A( ~通常, 当读写锁处于读模式锁住状态时, 如果有另外线程试图以写模式加锁, 读写锁通常会阻塞随后的读模式锁请求, 这样可以避免读模式锁长期占用, 而等待的写模式锁请求长期阻塞.
3 F% F7 d7 s9 t2 W2. 适用性:
. P1 C* O3 s5 O: ^7 Q0 G% C1 |! y) B- L
读写锁适合于对数据结构的读次数比写次数多得多的情况. 因为, 读模式锁定时可以共享, 以写模式锁住时意味着独占, 所以读写锁又叫共享-独占锁.
6 Y \; G% T. m6 B; M. A5 x* l; _8 s* {4 x3 J$ F
3. 初始化和销毁:% [- g; s0 c6 Z
5 S& |, u7 q- N& S8 O+ q
#include <pthread.h>
4 d! J \. }2 W) f5 x! C4 g
2 [4 v& x8 ?% `int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
. V7 y$ h1 A( _2 H) V# Tint pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
; Z" @- ?" H# Y8 j/ a+ a% n$ p0 R" |2 D6 {
成功则返回0, 出错则返回错误编号.) I8 P- e8 n$ j; J
/ `, B% E' l$ B3 h$ h' x1 {8 C$ O同互斥量以上, 在释放读写锁占用的内存之前, 需要先通过pthread_rwlock_destroy对读写锁进行清理工作, 释放由init分配的资源.8 T* [$ u' ]7 t5 y3 R% ] ~7 O
, c S- a+ r r, T9 {; T2 r4. 读和写:9 O1 E, J$ F- s$ K- ^/ ]) B
9 V6 u2 z; N& H) }7 P( I0 \5 R5 n
#include <pthread.h>
" ^, a" E% n4 X4 _3 S. Q3 G, A' ~; }2 A& W
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
- g! P6 g& E( C2 wint pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);' q, ?* g9 H/ L$ n1 w
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);) d- j3 i6 }' X+ p8 `3 h
6 {8 g7 N( K% W" x" n
) `' H) D6 C4 ]# k+ U- {成功则返回0, 出错则返回错误编号.5 [9 e1 F& U a6 C9 a
6 b! J' \- B& T; U1 h4 {
这3个函数分别实现获取读锁, 获取写锁和释放锁的操作. 获取锁的两个函数是阻塞操作, 同样, 非阻塞的函数为:
' u3 P; v! t: X n. X' I+ O2 L# F$ c, U" w- n" c7 C) M9 V
#include <pthread.h>% L4 b4 A. i8 Z; x9 e
* _; {: M& B* i" Vint pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);- w! |1 N. r: ]% |( _
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);8 H. q( l1 s: n4 F# [
v7 u$ y" Z& j成功则返回0, 出错则返回错误编号.
% P* W" q2 r- E9 y5 P! y; r3 z) L: E0 `' u1 q
非阻塞的获取锁操作, 如果可以获取则返回0, 否则返回错误的EBUSY.
' g- `4 L$ M0 }- b3 U5 f3 e
/ p, s Y" W: i# ]! @5. 属性设置2 t; C; C6 O8 V# ^
* A5 t! v5 ^, {: r" ?
#include <pthread.h>( t+ y) e' q6 d+ a+ a
int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
6 x9 w7 h' x+ H8 ~3 Y+ q! _ x8 Dint pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);# k. k) ]2 ?- N+ ? Z2 { Z
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict attr, int *restrict pshared);
) Z/ Y4 t6 t/ q( J7 o% ]! A' J, q int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr,int pshared);
8 F# r C* Z. [8 h
/ S! j" A( x3 W& C- Z) k5 b pthread_rwlockattr_setkind_np (attr, pref) |
|