17-读写信号量
7.5.5 读写信号量
读写信号量与信号量的关系与读写自旋锁和自旋锁的关系类似,读写信号量可能引起进程阻塞,但它可允许N个读执行单元同时访问共享资源,而最多只能有1个写执行单元。因此,读写信号量是一种相对放宽条件的粒度稍大于信号量的互斥机制。
读写自旋锁涉及的操作包括如下5种。
1.定义和初始化读写信号量
struct rw_semaphore my_rws; /定义读写信号量/
void init_rwsem(struct rw_semaphore sem); /初始化读写信号量*/
2.读信号量获取
void down_read(struct rw_semaphore *sem);
int down_read_trylock(struct rw_semaphore *sem);
3.读信号量释放
void up_read(struct rw_semaphore *sem);
4.写信号量获取
void down_write(struct rw_semaphore *sem);
int down_write_trylock(struct rw_semaphore *sem);
5.写信号量释放
void up_write(struct rw_semaphore *sem);
读写信号量一般这样被使用:
rw_semaphore rw_sem; / 定义读写信号量 /
init_rwsem(&rw_sem); / 初始化读写信号量 /
/ 读时获取信号量 /
down_read(&rw_sem);
... / 临界资源/
up_read(&rw_sem);
/ 写时获取信号量 /
down_write(&rw_sem);
... / 临界资源 /
up_write(&rw_sem);