linux是一个多任务的操作系统,在多个进程同时运行时,就有可能为了竞争同一个资源发生堵塞。以下是解决的几种方法
1:信号量
DECLARE_MUTEX(sem);
if(down_interruptible(&sem))
{
return –ERESTARTSYS;
}
//critical section
up(&sem);
2:完成量
DECLARE_COMPLETION(xxx_comp);
ssize_tcomplete_read(structfile *filp,
char __user *buf,size_tcount,
loff_t *pos)
{
wait_for_completion(&xxx_comp);
return 0;
}
ssize_tcomplete_write(structfile *filp,
const char __user *buf,size_tcount,
loff_t *pos)
{
complete(&xxx_comp);
return count;
}
3:自选锁
spinlock_tlock;
spin_lock_init(&lock);
spin_lock(&lock);
//critical section
spin_unlock(&lock);
4:中断屏蔽
local_irq_disable();
//critical section
local_irq_enable();
其他还有原子操作等。这几种方法用法很简单,信号量用的最多,但有些场合不适用,具体我也不是很懂