请问这种写法为何会造成死锁了。

chxy85 2012-07-31 12:55:20

void test_thread1()
{
printk(KERN_ALERT"thread1 begin\n");
while(nCount <= 100)
{
spin_lock( &my_spinlock );
nCount++;
schedule_timeout((100)* HZ / 1000);
printk(KERN_ALERT"Hello,driver,now thread1 nCount=%d\n",nCount);
spin_unlock( &my_spinlock );
}

}

void test_thread2()
{
printk(KERN_ALERT"thread2 begin\n");
while(nCount <= 100)
{
spin_lock( &my_spinlock );
nCount++;
schedule_timeout((100)* HZ / 1000);
printk(KERN_ALERT"Hello,driver,now thread2 nCount=%d\n",nCount);
spin_unlock( &my_spinlock );
}
}


如上,是内核驱动的代码节选,在研究自旋锁,上面的代码百试百飞,并且只能reset电脑。
就是不是很理解,感觉跟应用层的线程间区别很大,对上面的代码理解如下:
假如test_thread1首先获得cpu,当到了schedule_timeout时会将CPU交出去,然后test_thread2获取到CPU后,在spin_lock处锁住了,不再往下执行,可是为什么这时CPU不会回到test_thread1去,是不是就一直卡在test_thread2的spin_lock了,为什么CPU不能在多个线程间切换。而且一个线程导致了整个内核都挂了?!

小弟之前一直是做WIN应用的,最近工作需要开始接触linux内核驱动,有很多地方不理解,求请教。
...全文
206 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangzhaozaki 2012-08-06
  • 打赏
  • 举报
回复
spin_lock会禁止CPU的抢占,spin_lock里是不能休眠的。
LDD3上面有说明,也可以看下
http://www.embedu.org/Column/Column25.htm
chxy85 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

自旋锁是忙等待,不会切出去的。
[/Quote]

不是很理解,难道这个时候CPU不会切出去工作其他线程么?就好像是写了个死循环?
falloutmx 2012-07-31
  • 打赏
  • 举报
回复
自旋锁是忙等待,不会切出去的。
chxy85 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

自旋锁是不可睡眠的。
[/Quote]

为什么不可睡眠?而且schedule_timeout这个函数会在一定时间后自己醒过来吧。
帅得不敢出门 2012-07-31
  • 打赏
  • 举报
回复
自旋锁是不可睡眠的。


4,437

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧