- 论坛徽章:
- 0
|
spin_lock_irqsave -------该宏如果获得自旋锁lock,它也将保存标志寄存器的值到变量flags中,并且失效本地中断,--------
-------本地中断失效??,是不是线程调度机制也被禁止了??
我写了个测试的驱动
case IOCTL_CMD_CLOSE:
{
spin_lock_irqsave (&test_lock, flags);
printk("i am pthread close lock%d\n",arg);
break;
}
case IOCTL_CMD_OPEN:
{
printk("i am pthread open lock %d\n",arg);
spin_unlock_irqrestore (&test_lock, flags);
break;
}
应用是
for (i=0;i<5;i++)
{
err = pthread_create(&tid, NULL,spin_test,(void *)i);
if(err != 0){
printf("can't create thread: %d\n",i);
return 0;
}
线程里面是
ioctl(fd,IOCTL_CMD_CLOSE,j);
sleep(4-i);
ioctl(fd,IOCTL_CMD_OPEN,j);
结果是
OPEN: major=233, minor=1
i am pthread close lock0
i am pthread close lock1
i am pthread close lock2
i am pthread close lock3
i am pthread close lock4
i am pthread open lock 4
i am pthread open lock 3
i am pthread open lock 2
i am pthread open lock 1
i am pthread open lock 0
CLOSE: major=233, minor=1
结论是:发现为什么lock0 ,没有解锁时候, lock1 马上就上锁了! 不是lock1要自旋吗?lock2.3.4也是
case IOCTL_CMD_CLOSE:
{
spin_lock_irqsave (&test_lock, flags);
local_irq_disable();
printk("lock is :%d\n", spin_is_locked(&test_lock));
printk("i am pthread%d lock\n",arg);
count++;
printk("count= %d\n",count);
break;
}
case IOCTL_CMD_OPEN:
{
printk("count= %d\n",count);
printk("i am pthread%d unlock \n",arg);
spin_unlock_irqrestore (&test_lock, flags);
local_irq_enable();
count--;
printk("lock is :%d\n", spin_is_locked(&test_lock));
break;
}
结果OPEN: major=233, minor=1
lock is :0
i am pthread0 lock
count= 1
lock is :0
i am pthread1 lock
count= 2
lock is :0
i am pthread2 lock
count= 3
lock is :0
i am pthread3 lock
count= 4
lock is :0
i am pthread4 lock
结论:看来spinlock没有编译,,但是local_irq_enable();了 怎么线程调度还有呢??奇怪-----------------
[ 本帖最后由 xiaochangfu 于 2009-11-9 15:14 编辑 ] |
|