驱动的互斥
应用程序:互斥可以解决多个进程或线程对共享资源的竞争访问问题
驱动程序:
驱动:设备号=主设备号+次设备号
主设备号:表示一类设备,对应一个驱动程序(主设备用来表示一个特定的驱动程序)
次设备:该类设备中的某一个设备,表示使用驱动程序的某一个设备。
多个子设备共用一个驱动程序,若多个子设备同时访问该驱动程序,那么就会
造成竞态访问。如何解决驱动程序的竞态访问问题呢?linux内核提供了多种
互斥方法:互斥锁 信号量 原子变量 自旋锁。。。
2.1互斥锁 pthread_mutex_t mutex;
1 定义互斥锁
struct mutex mutex;//内核互斥锁
2 初始化互斥锁
mutex_init(&mutex) ;-->HelloModule
3 加锁
mutex_lock(&mutex);-->helloOpen
4 解锁
mutex_unlock(&mutex);-->helloClose
2.2信号量
1 定义信号量
struct semaphore sem;//内核信号量
2 初始化信号量
sema_init(&sem,1);-->hellomodule
3 获取信号量
down_interruptible(&sem);-->p操作 sem_wait-->helloOpen
4 释放信号量
up(&sem);-->V操作 sem_post--->helloClose
2.3原子变量
1 定义一个原子变量并初始化
atomic_t a=ATOMIC_INIT(1);
注:用原子变量来保证对共享资源访问的原子性操作
2 如何使用原子变量
可以通过Linux内核提供的接口函数来操作原子变量
atomic_dec_and_test
atomic_inc
helloOpen:
atomic_dec_and_test(&a):给原子变量减1,并测试其值是不是0?如果为0,
返回true;如果不为0,返回false。
if(!atomic_dec_and_test(&a))
{
atomic_inc(&a); a=0
return -EBUSY;
}
使用公共资源
helloClose:
atomic_inc(&a)
2.4 自旋锁--》忙等锁
1 定义自旋锁
spinlock_t g_SpinLock;
2 初始化自旋锁
spin_lock_init(&g_SpinLock);-->HelloModule
3 获取自旋锁
spin_lock(&g_SpinLock);-->HelloOpen
4 释放自旋锁
spin_unlock(&g_SpinLock)-->HelloClose