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

chxy85 chxy85 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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内核驱动,有很多地方不理解,求请教。
...全文
评论 5
收藏 已收藏
分享
返回顶部
chxy85
Linux_Kernel 4,469 成员 17,458 内容