1.通用版
信号量用于对一个或多个资源进行互斥访问。基本操作如下:
void sema_init(struct semaphore *sem, int val);//信号量初始化函数
静态初始化:
DECLARE_MUTEX(name);//初始化为1
DECLARE_MUTEX_LOCKED(name);//初始化为0
动态初始化:
void init_MUTEX(struct semaphore *sem);
void init_MUTEX_LOCKED(struct semaphore *sem);
在linux中,P函数称为down,V函数称为up。
void down(struct semaphore *sem);//不可中断版本
int down_interruptible(struct semaphore *sem);//可中断版本
int down_trylock(struct semaphore *sem);//不等待版本,立即返回,0表示成功。
一般情况下使用down_interruptible函数,它允许一个在信号量上等待的用户空间进程被用户打断。不过在使用该函数时必须记住要检查它的返回值,并做出相应的处理。该函数被中断时返回一个非零值。
void up(struct semaphore *sem); //释放占用的信号量
2.读写信号量
读/写信号量rw_semaphore
说明:允许一个进程写,多个进程读
头文件:<linux/rwsem.h>
初始化函数:
void init_rwsem(struct rw_semaphore *sem);
相关操作:
void down_read(struct rw_semaphore *sem);
Int down_read_trylock(struct rw_semaphore *sem);//非0表示成功
void up_read(struct rw_semaphore *sem);
void down_write(struct rw_semaphore *sem);
int down_write_trylock(struct rw_semaphore *sem);
void up_write(struct rw_semaphore *sem);
void downgrade_write(struct rw_semaphore *sem);