linux mutex使用检测锁,Linux驱动:互斥锁mutex测试
Linux驱动:互斥锁mutex测试
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
环境:
主机:Fedora12
目标板:MINI6410
目标板LINUX内核版本:2.6.38
互斥锁主要函数:
//创建互斥锁
DEFINE_MUTEX(mutexname);
//加锁,如果加锁不成功,会阻塞当前进程
void mutex_lock(struct mutex *lock);
//解锁
void mutex_unlock(struct mutex *lock);
//尝试加锁,会立即返回,不会阻塞进程
int mutex_trylock(struct mutex *lock);
测试代码:
#include
#include
#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "led_driver"
#define T_MAJORS700
static struct cdev fun_cdev;
static dev_t dev;
static struct class *led_class;
//初始化互斥锁
static DEFINE_MUTEX(sem);
//功能:初始化IO
static void init_led(void)
{
unsigned temp;
//GPK4-7设置为输出
temp = readl(S3C64XX_GPKCON);
temp &= ~((0xf << 4) | (0xf << 5) | (0xf << 6) | (0xf<< 7));
temp |= (1 << 16) | (1 << 20) | (1 << 24) | (1 << 28);
writel(temp, S3C64XX_GPKCON);
}
//功能:ioctl操作函数
//返回值:成功返回0
static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
unsigned int temp = 0;
//unsigned long t = 0;
wait_queue_head_t wait;
//加锁
mutex_lock(&sem);
temp = readl(S3C64XX_GPKDAT);
if (cmd == 0)
{
temp &= ~(1 << (arg + 3));
}
else
{
temp |= 1 << (arg + 3);
}
//等待2S
//t = jiffies;
//while (time_after(jiffies,t + 2 * HZ) != 1);
init_waitqueue_head(&wait);
sleep_on_timeout(&wait,2 * HZ);
writel(temp,S3C64XX_GPKDAT);
printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d jiffies = %d\n",cmd,arg,jiffies);
//解锁
mutex_unlock(&sem);
return 0;
}
static struct file_operations io_dev_fops = {
.owner = THIS_MODULE,
.unlocked_ioctl = led_driver_ioctl,
};
static int __init dev_init(void)
{
int ret;
unsigned temp;
init_led();
dev = MKDEV(T_MAJORS,0);
cdev_init(&fun_cdev,&io_dev_fops);
ret = register_chrdev_region(dev,1,DEVICE_NAME);
if (ret < 0) return 0;
ret = cdev_add(&fun_cdev,dev,1);
if (ret < 0) return 0;
printk (DEVICE_NAME"\tjdh:led_driver initialized!!\n");
led_class = class_create(THIS_MODULE, "led_class1");
if (IS_ERR(led_class))
{
printk(KERN_INFO "create class error\n");
return -1;
}
device_create(led_class, NULL, dev, NULL, "led_driver");
return ret;
}
static void __exit dev_exit(void)
{
unregister_chrdev_region(dev,1);
device_destroy(led_class, dev);
class_destroy(led_class);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("JDH");
测试
用http://blog.csdn.net/jdh99/article/details/7178741中的测试程序进行测试:
开启两个程序,同时打开,双进程同时操作LED
linux mutex使用检测锁,Linux驱动:互斥锁mutex测试相关推荐
- Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)
本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...
- linux进程线程同步之 - POSIX线程互斥锁
POSIX线程互斥锁 使用范围:线程同步 本文转自:http://blog.csdn.net/jiebaoabcabc/article/details/37914769 一.函数介绍 1.初始化互斥锁 ...
- python互斥锁原理_Linux 互斥锁的实现原理(pthread_mutex_t)
引言 互斥锁大都会使用,但是要了解其原理就要花费一番功夫了.尽管我们说互斥锁是用来保护一个临界区,实际上保护的是临界区中被操纵的数据. 互斥锁还是分为三类:快速互斥锁/递归互斥锁/检测互斥锁 fute ...
- 互斥锁机制,互斥锁与读写锁区别
Linux的4种锁机制: 互斥锁:mutex,用于保证在任何时刻,都只能有一个线程访问该对象.当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒 读写锁:rwlock,分为读锁和写锁.处于读操作时 ...
- android 线程互斥锁,多线程编程-互斥锁
1.引言: 互斥锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源.可以保证以下三点: 原子性:把一个互斥量锁定为一个原子操作,这意味着操作系统(或pthread函数库)保证了如果 ...
- 悲观|乐观锁、自旋|互斥锁、公平|非公平锁
解析锁--悲观|乐观锁.自旋|互斥锁.公平|非公平锁 悲观锁 总认为最坏的情况可能会出现,即认为数据很可能会被他人修改,因此在持有数据时总是先把资源或数据锁住.这样其他线程要请求这个资源时就会阻塞,直 ...
- Linux学习之系统编程篇:互斥锁(pthread_mutex_init / lock / trylock / unlock / destroy)
一.主要函数介绍 (1)定义锁 : pthread_mutex_t mutex; //互斥锁 数据类pthread_mutex_t (2)初始化锁: int pthread_mutex_init(pt ...
- C#线程锁(自旋锁SpinLock、互斥锁Mutex、混合锁Monitor | lock)
一.自旋锁 自旋锁是指当一个线程在获取锁对象的时候,如果锁已经被其它线程获取,那么这个线程将会循环等待,不断的去获取锁,直到获取到了锁.适合于原子操作时间非常短的场景 优点:避免了线程上下文切换.性能 ...
- [Todo] 乐观悲观锁,自旋互斥锁等等
乐观锁.悲观锁.要实践 http://chenzhou123520.iteye.com/blog/1860954 <mysql悲观锁总结和实践> http://chenzhou123520 ...
- 同步方法中的锁对象_互斥锁与读写锁:如何使用锁完成Go程同步?
图转自https://colobu.com/2018/12/18/dive-into-sync-mutex/ 这张图容易让人产生误解,容易让人误以为goroutine1获取的锁,只有goroutine ...
最新文章
- 苏炫杰全国计算机等级考试,第九届全国中学生物理竞赛预赛第一试试题.doc
- 王咏刚分享DeeCamp三年成功经验:学生超自主,导师很顶尖,批量培养AI人才不是梦...
- 使用Java和Google GSON解析ESPN API
- Linux下串口ttyS2,ttyS3不能用的问题解决办法
- CentOS 7.2.1511 x64下载地址
- android面试经典,Android经典面试题集锦(一)
- 诺基亚入门级音乐手机售319元
- Mac 技巧——让Mac轻松访问Windows网络共享
- win10 U盘无法识别修复方法
- 电脑声音图标显示正常却没有声音,扬声器显示未插入
- Pygame Draw绘图函数详解
- 系统架构师进阶(Believe Youself)
- AUTOSAR架构中的配置文件
- android应用备份,Android备份App及数据
- 用java实现图片合并与折叠
- simulink模块名称显示设置_simulink模块名称继承
- Linux sed实战(MarkDown版本)
- 第一次做项目经理总结_干货:项目结束后,哪些经验教训要总结?
- Seastar源码阅读(三)future
- http请求方法:GET、POST、PUT、PATCH、DELETE、OPTIONS、HEAD、TRACE
热门文章
- php正则判断括号中的,PHP实现正则匹配所有括号中的内容
- 关于Lambda表达式的简单语法理解,有参无参,有无返回值的格式的理解,仅限编程新手
- java button 背景色_以编程方式删除UIButton背景颜色
- php数据库模式,具有singleton模式的PHP数据库类[closed]
- 盘点遥测终端RTU怎么分类?
- Centos7下编译安装Nginx、Mysql、PHP(文章底部包含一键安装脚本)
- 谈家装安防防盗设备的重要性
- netty高级篇(3)-HTTP协议开发
- linux命令比较命令,Linux命令 比较文件
- Mybatis原生dao开发方法实现增删改查