|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 ^% n* l' W4 z+ V1. 特性:# |* O# o! r+ X
# [! ]8 @' c6 U4 `2 ~+ b- Q2 {
一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性,
1 d5 U0 n2 [1 M9 O# Z; ?
( U* C. c, |3 d% O2 r当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.8 \' I) v* d* o( C4 x: g( A* y" E
当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须阻塞知道所有的线程释放锁.1 i$ B1 s# F$ J! Q% Z1 N5 T) O
通常, 当读写锁处于读模式锁住状态时, 如果有另外线程试图以写模式加锁, 读写锁通常会阻塞随后的读模式锁请求, 这样可以避免读模式锁长期占用, 而等待的写模式锁请求长期阻塞.* h* c z% x" I4 [+ K% Q% H' l8 B
2. 适用性:
6 F1 X) |( c. t5 U( {: a
5 O2 s+ c5 q& z- @- a2 Z 读写锁适合于对数据结构的读次数比写次数多得多的情况. 因为, 读模式锁定时可以共享, 以写模式锁住时意味着独占, 所以读写锁又叫共享-独占锁. v2 N T0 M% k$ w5 B8 w* ?* g+ k
; p' j' V7 d: G2 \$ q4 O7 k
3. 初始化和销毁:5 n1 Y9 j7 R/ M! k" O; P1 ?4 j
8 ^. A1 {# l/ \7 N3 t$ a
#include <pthread.h>
$ g- K- @ i5 B5 F \, c+ L. u
8 z/ Z) n8 m+ e5 u. Eint pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
' X7 U# y' K% e i4 r9 aint pthread_rwlock_destroy(pthread_rwlock_t *rwlock);/ G; X; H, d% t$ h: z4 d6 |" }
8 w5 j- {( L5 b+ D
成功则返回0, 出错则返回错误编号.- V2 c/ P3 M2 ~7 Z" S! l9 y' H5 ?
: Y8 ]5 h5 U& z2 R7 G, S0 r% N. C+ h
同互斥量以上, 在释放读写锁占用的内存之前, 需要先通过pthread_rwlock_destroy对读写锁进行清理工作, 释放由init分配的资源.# a* Z# b; K1 I% T K b
/ \ Q) f. Y; g+ }4. 读和写:
8 T" ~# k4 l4 ~7 g+ J- ?/ q9 i3 ^- E+ g( |8 P
#include <pthread.h>
+ W8 i& F4 q4 W
' O7 U7 A/ H7 F& Yint pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);$ @% z, P9 q/ h! q# N. v: K! D
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
9 c J b, I- E# c! k% g+ [int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
1 W+ k, u7 L# ?0 x: R# k$ c& \; M9 x* c' R( c
. X, `! B% y, P- U成功则返回0, 出错则返回错误编号.
6 W4 |* M# E4 P7 ~: c: ~' S
- h; v* }9 W' x, d2 w9 p& U6 r 这3个函数分别实现获取读锁, 获取写锁和释放锁的操作. 获取锁的两个函数是阻塞操作, 同样, 非阻塞的函数为:
, w. x* C" N0 M! N; b, t" K
& b1 K# E+ G0 z#include <pthread.h>
c: ~2 L; g$ }7 V! p4 N0 D+ ]& \: N/ R8 k' T6 N% U
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);) x( O3 o/ P9 O8 s5 g
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);" Y" a- S: f' t& a
( F {- |( K& T& h2 h1 V6 F
成功则返回0, 出错则返回错误编号.0 _5 I: ^3 t6 E5 Y' j1 l, g
& R- x# `# A _" \5 R
非阻塞的获取锁操作, 如果可以获取则返回0, 否则返回错误的EBUSY., K. p5 \: F6 r7 D7 x
$ P# N- @! j3 Q8 D( j* o$ j5. 属性设置. Q, ^6 W2 \; k8 a+ e$ k
! `, {, O8 K. f% `( K#include <pthread.h>) j8 s: U" R$ B% L$ \
int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
6 O4 o3 b% j: R* c, s0 ?( ]int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);4 Y6 U( q& p6 u# Z
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict attr, int *restrict pshared);# u! t* r, r) B2 z$ B
int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr,int pshared);
* \' }! i9 f9 W1 T- C
8 K- o# l3 N {/ J6 O$ l; X% _ pthread_rwlockattr_setkind_np (attr, pref) |
|