读写信号量概述
读写信号量和信号量的关系与读写自旋锁和自旋锁的关系类似。读信号量和写信号量是互斥的,但允许N个读执行单元同事访问共享资源(同事获取读信号量),而最多允许一个写进程获取写信号量。因此,读写信号量相对于信号量更宽松,对于读多写少的情况会明显提高程序的执行效率。
读写信号量的使用方法
(1) 定义和初始化读写信号量
struct rw_semaphore rw_sem; /* 定义读写信号量 */
int_rwsem(struct rw_semaphore *sem); /* 初始化读写信号量 */
init_rwsem实际上是一个宏,用来初始化读写信号量,需要传递一个**rw_semaphore结构体的指针。
(2) 获取读信号量
void down_read(struct rw_semaphore *sem);
int down_read_trylock(struct rw_semaphore *sem);
down_read 函数用于获取读信号量,如果无法获取读信号量则会进入休眠。
down_read_trylock 函数不管是否获取到读信号量都会立刻返回。如果成功获取到读信号量则返回1,否则返回0.
(2) 释放读信号量
void up_read(struct rw_semaphore *sem);
(3) 获取写信号量
void down_write(struct rw_semaphore *sem);
void down_write_trylock(struct rw_semaphore *sem);
down_write 函数用于获取写信号量,如果无法获取写信号量则会进入休眠。
down_write_trylock 函数不管是否获取到写信号量都会立刻返回。如果成功获取到写信号量则返回1,否则返回0.
(4) 释放写信号量
void up_write(struct rw_semaphore *sem);