互斥锁可以说是“量值” 为 1 的
信号量, 最终实现的效果相同, 既然有了信号量, 那为什么还要有互斥锁呢? 这就是我们这里需要了解并掌握的
文章目录
参考资料
前面了解了原子操作和自旋锁,当然还有之前的字符设备相关操作,前面基础知识还是需要重点掌握的,才能将知识点串联起来:
接下来还是以前面字符设备 动态参数传递实验为基础,打开访问字符设备实验。 所以以前知识点 建议了解
在字符设备这块内容,所有知识点都是串联起来的,需要整体来理解,缺一不可,建议多了解一下基础知识
驱动-申请字符设备号
驱动-注册字符设备
驱动-创建设备节点
驱动-字符设备驱动框架
驱动-杂项设备
驱动-内核空间和用户空间数据交换
驱动-文件私有数据
Linux驱动之 原子操作
Linux驱动—原子操作
驱动-自旋锁
驱动-自旋锁死锁
驱动-信号量
互斥锁的介绍
-
将信号量量值设置为 1, 最终实现的就是互斥效果, 这里要了解的互斥锁功能相同, 虽然两者功能相同但是具体的实现方式是不同的, 但是使用互斥锁效率更高、更简洁, 所以如果使用到的信号量“量值”为 1,一般将其修改为使用互斥锁实现。当有多个线程几乎同时修改某一个共享数据的时候, 需要进行同步控制。线程同步能够保证多个线程安全访问竞争资源, 最简单的同步机制是引入互斥锁。
-
互斥锁为资源引入一个状态: 锁定或者非锁定。 某个线程要更改共享数据时, 先将其锁定, 此时资源的状态为“锁定” , 其他线程不能更改;直到该线程释放资源, 将资源的状态变成“非锁定” , 其他的线程才能再次锁定该资源。 互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性, 能够保证多个线程访问共享数据不会出现资源竞争及数据错误
互斥锁结构体 - mutex
struct mutex {
atomic_t count; // 锁计数器:1-未锁,0-已锁,负值-有等待者
spinlock_t wait_lock; // 保护等待队列的自旋锁
struct list_head wait_list; // 等待该锁的进程队列
};
互斥锁 API

互斥锁实验
源码程序-mutex.c
这个源码程序,用到的还是访问字符设备的最基本内容来讲解,另外添加了 互斥锁api 来规避并发和竞争
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/delay.h>
#include <linux/atomic.h>
#include <linux/errno.h>
#include <linux/semaphore.h>
#include <linux/mutex.h>
struct mutex mutex_test;//定义mutex类型的互斥锁结构体变量mutex_test
static int open_test(struct inode *inode,struct file *file)
{
printk("\n this is open_test \n");
mutex_lock(&mutex_test);//互斥锁加锁
return 0;
};
static ssize_t read_test(struct file *file,char __user *ubuf,size_t len,loff_t *off)
{
int ret;
char kbuf[10] = "topeet";//定义char类型字符串变量kbuf
printk("\nthis is read_test \n");
ret = copy_to_user(ubuf,kbuf,strlen(kbuf));//使用copy_to_user接收用户空间传递的数据
if (ret != 0){
printk("copy_to_user is error \n");
}
printk("copy_to_user is ok \n");
return 0;
}
static char kbuf[10] = {
0};//定义char类型字符串全局变量kbuf
static ssize_t write_test(struct file

最低0.47元/天 解锁文章
1214

被折叠的 条评论
为什么被折叠?



