当前位置: 技术问答>linux和unix
spin_lock为什么不自旋?
来源: 互联网 发布时间:2016-03-07
本文导语: static int globalvar_open(struct inode *inode, struct file *filp) { spin_lock(&spin); if(globalvar_count) { printk(KERN_ALERT "777n"); return -EBUSY; } globalvar_count++; return 0; } 上述的代...
static int globalvar_open(struct inode *inode, struct file *filp)
{
spin_lock(&spin);
if(globalvar_count)
{
printk(KERN_ALERT "777n");
return -EBUSY;
}
globalvar_count++;
return 0;
}
上述的代码我经过调试后一直有个疑问,在第一个进程执行open系统调用后,没有释放该锁,但是当第二个进程通过系统调用open以后说打开设备失败,但是还能把那三个7打印出来,我想问的是这不与自旋锁的原理相矛盾吗?应该是第一个进程没有释放该锁的情况下第二个进程来打开时,spin_lock(&spin);那里应该自旋了,那为什么还能打印3个7呢?谢谢
{
spin_lock(&spin);
if(globalvar_count)
{
printk(KERN_ALERT "777n");
return -EBUSY;
}
globalvar_count++;
return 0;
}
上述的代码我经过调试后一直有个疑问,在第一个进程执行open系统调用后,没有释放该锁,但是当第二个进程通过系统调用open以后说打开设备失败,但是还能把那三个7打印出来,我想问的是这不与自旋锁的原理相矛盾吗?应该是第一个进程没有释放该锁的情况下第二个进程来打开时,spin_lock(&spin);那里应该自旋了,那为什么还能打印3个7呢?谢谢
|
要看看你的什么平台,内核是否编译为可抢占的,自旋锁主要针对SMP或单CPU但内核可抢占的情况,
对于单CPU和内核不支持抢占的系统,自旋锁退化为空操作。
对于单CPU和内核不支持抢占的系统,自旋锁退化为空操作。