Linux驱动---内核互斥锁

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、演示效果

在这里插入图片描述
在这里插入图片描述


休眠的时候不能被打断
在这里插入图片描述
休眠完成以后才执行信号,休眠期间被阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值