1、互斥体概述
互斥概念:只能有一个人使用
信号量是在并行处理环境中对多个处理器访问某个公共资源进行保护的机制,Muter用于互斥操作。
mutex的语义相对于信号量要简单轻便一些,在锁争用激烈的测试场景下,Mutex比信号量执行速度更快,可拓展性更好,另外Mutex数据结构的定义比信号量小
2、Mutex(互斥体)的使用注意事项
·同一时刻只有一个线程可以持有Mutex
·只有锁持有着可以解锁,不能在一个进程中持有Mutex,在另外一个进程中释放它
·不允许递归的加锁和解锁
·当进程持有Mutex时,进程不可以退出
·Mutex必须使用官方的API初始化
·Mutex可以睡眠,所以不允许在中断处理程序或者中断下半部中使用,例如tasklet、定时器等
3、初始化
静态定义:
DEFINE_MUTEX(name);
动态初始化mutex:
mutex_init(&mutex);
4、互斥锁的操作
mutex_lock(struct mutex*);
·为指定的mutex上锁,如果不可用则睡眠
mutex_unlock(struct mutex*);
·为指定的mutex解锁
mutex_trylock(struct mutex*);
·尝试获取指定的mutex,如果成功则返回1;否则锁被获取,返回值是0
mutex_is_lock(struct mutex*);
·如果锁已被征用,则返回1;否则返回0
5、示例代码
struct mutex mutex;
int flage = 1; // 1: available 0:busy
static int hello_open (struct inode *inode, struct file *filep)
{
printk("hello_open()\n");
mutex_lock(&mutex); //加锁
if(flage != 1) //分析一下感觉这个flage可以不要
//这个锁可以用来互斥使用一个全局变量,也可以用来互斥使用一个设备
//不加flage就相当于是保护这个大设备,加flage为互斥使用一个全局变量
{
mutex_unlock(&mutex);
return -EBUSY;
}
//occupy device
flage = 0;
//
return 0;
}
static int hello_release (struct inode *inode, struct file *filep)
{
printk("hello_release()\n");
//release device
flage = 1;
mutex_unlock(&mutex);//解锁
return 0;
}
//测试程序
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{
int fd;
int len;
char buf[64]={0};
char buf2[64+1]="peng";
fd = open("/dev/hellodev",O_RDWR);
if(fd<0)
{
perror("open fail \n");
return;
}
printf("before sleep\n");
sleep(15);
printf("after sleep\n");
close(fd);
}
6、演示效果
休眠的时候不能被打断
休眠完成以后才执行信号,休眠期间被阻塞