|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 i7 R( M5 R. B V# w5 D3 Y! b+ k
1. 特性:* ]4 G7 {* ^1 K7 W3 V2 r7 i
3 t; ~8 c+ ?7 i8 X2 E% X! {4 V
一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性,
8 `7 ~+ _# u N0 K- }# o% d" {& V. V* r l: y
当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.
]. i7 J0 z8 `8 i" G+ _当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须阻塞知道所有的线程释放锁.8 A2 b+ M b' g! b5 e
通常, 当读写锁处于读模式锁住状态时, 如果有另外线程试图以写模式加锁, 读写锁通常会阻塞随后的读模式锁请求, 这样可以避免读模式锁长期占用, 而等待的写模式锁请求长期阻塞.
$ o, K4 w5 ?7 \5 ~2 K2 C U" e2. 适用性:* ^5 q3 Y4 N; ?# v' {/ Y! U
5 w- k5 f# N [/ _5 J
读写锁适合于对数据结构的读次数比写次数多得多的情况. 因为, 读模式锁定时可以共享, 以写模式锁住时意味着独占, 所以读写锁又叫共享-独占锁.6 C+ P- k9 c a( R1 I- J' \6 g
7 T6 k( P& c% V7 {9 L/ J
3. 初始化和销毁:2 T, Q. v3 E) c, W0 g8 z% O3 {
* |4 [/ U& F1 G' T; i& B- c# ^* W#include <pthread.h>
& p: P- ?" @ V
7 `" ?- h& J& L% y8 t) s c) hint pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
' g* S' a8 }8 m3 v7 c5 ^0 Sint pthread_rwlock_destroy(pthread_rwlock_t *rwlock);* h" e* j7 @7 a
* t, e2 u% |$ |2 m' `1 q. G8 X
成功则返回0, 出错则返回错误编号., Y. C, Q v# D1 f8 ^* j
5 j' m0 u" j: q) j
同互斥量以上, 在释放读写锁占用的内存之前, 需要先通过pthread_rwlock_destroy对读写锁进行清理工作, 释放由init分配的资源.. N* h7 ]4 ^1 d( {) e+ F
' z: s) i5 i: y7 ~! H6 Z: f4. 读和写:
0 W' c Q$ d. Y. v9 s4 P
9 d. u/ H' ]1 j; J% l' W#include <pthread.h>3 F, w. R, O9 c- C$ r A( M
s9 r1 H7 F- }% }" S$ Yint pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
' Q& O0 }* ^' sint pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);, T: a5 h$ K) c! g, @( f- J3 L2 J
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
$ z' v2 m9 R5 l$ L( }1 C& r! v0 v9 p: l9 p( i
% f6 O% u7 d( [* v! `* @
成功则返回0, 出错则返回错误编号. X. B" l7 x) Z4 Y4 M
" R' _% J8 T: t5 P: e 这3个函数分别实现获取读锁, 获取写锁和释放锁的操作. 获取锁的两个函数是阻塞操作, 同样, 非阻塞的函数为:
6 `) w4 p# I9 ^% X/ X! `8 y0 h
, {) `+ Z! i r7 l' f) M#include <pthread.h>/ B5 n, X% t' o6 [& j* H- ]
- [; O. a/ p4 j' V( sint pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);) }, j+ V& Y4 L! a+ p
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);4 t* c& E6 r- M& |; V5 q3 Z% W- _
/ @$ h$ J9 j- M L" V4 r
成功则返回0, 出错则返回错误编号.2 q7 S9 k- B$ S. ]7 u
) J h1 S. i* N$ x$ B8 k
非阻塞的获取锁操作, 如果可以获取则返回0, 否则返回错误的EBUSY." k u( L9 ~0 T. {
! z2 J# ?! j7 @8 V; H' y8 x* l5. 属性设置
3 Y w: x% b0 F# B: e) |; Y( ?% [ o6 h) n+ C
#include <pthread.h>6 U2 ^, o( X" V( w a1 u
int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);) z" d! `/ `5 Q( t
int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
5 P1 R* s- [& a& z3 c! o. f int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict attr, int *restrict pshared);
3 W1 d7 O; h: [! O4 [* L int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr,int pshared);
( U( N* P# Y% L7 t# F, [# W
% s! \- A# W0 }! w. h7 J. @/ t pthread_rwlockattr_setkind_np (attr, pref) |
|