先看是单处理器还是多处理器。
那个输出结果看上去是不正常。看看是否自己程序其他地方有问题。
要有问题也应该是创建线程那个for循环有!!但我感觉这样创建线程应该没错吧!
回复 #8 dreamice 的帖子
有点道理!!那就是for循环创建线程没有调度机制了!!乱了!!为什么lock0 ,没有解锁时候, lock1 马上就上锁了! 这个按照我们的思维应该是在lock1那里自旋,没有调度机制了,也应该会是等待接锁吧? 原帖由 xiaochangfu 于 2009-11-6 10:48 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
spin_lock_irqsave -------该宏如果获得自旋锁lock,它也将保存标志寄存器的值到变量flags中,并且失效本地中断,--------
-------本地中断失效??,是不是线程调度机制也被禁止了??
我写了个测试的驱动
...
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%dlock\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 pthread0lock
count= 1
lock is :0
i am pthread1lock
count= 2
lock is :0
i am pthread2lock
count= 3
lock is :0
i am pthread3lock
count= 4
lock is :0
i am pthread4lock
结论:看来spinlock没有编译,,但是local_irq_enable();了怎么线程调度还有呢??奇怪
回复 #13 xiaochangfu 的帖子
你创建的进程,在何时被内核调度,这个时间点你是没办法控制的 原帖由 xiaochangfu 于 2009-11-6 10:54 发表 http://linux.chinaunix.net/bbs/images/common/back.gif说明下这是在但cpu下面的,我只是想用irqsave--本地中断失效这个功能
LZ不是说了是UP, 在UP下, spin_lock_irqsave只是一个local_irq_disable的操作,并没有自旋。。。
而你返回用户态的时候,eflags会被恢复成进入kernel之前的状态。
[ 本帖最后由 eexplorer 于 2009-11-9 17:34 编辑 ]
回复 #15 eexplorer 的帖子
对的!!我看了下是说在内核的中断禁止,到用户态就自动恢复进入内核前的状态了! 所以说我在用户和内核之间转来转去中断禁止没啥作用了!!那位有什么好的方法可以检测下up下的抢占 的spinlock的运用
谢谢了 写两个内核线程,来调试一下
回复 #17 dreamice 的帖子
我想这样做!!内核线程不能用sleep 啊!!怎么延时判断呢?指点下!谢谢了!回复 #18 xiaochangfu 的帖子
内核有延迟函数,也可以主动放弃CPU的,你看看源代码
页:
1
[2]