请问这种写法为何会造成死锁了。
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内核驱动,有很多地方不理解,求请教。
...全文
相关推荐
易语言-易语言简单多线程写法
易语言简单多线程写法源码
SQL Server死锁总结.rar
SQL Server死锁总结
什么是死锁,如何避免死锁?Java死锁详解
什么是死锁 死锁是指多个进程因竞争资源而引起的一种僵局,如果没有外力作用,所有进程都不会向前推进。 举例:假如有线程Thread1和Thread2,两个都要访问共享资源AB,Thread1和Thread2一个先访问A再访问B,另一个先访问B再访问A。但在他们线程未执行完时,都不会释放AB资源,那么就形成了一种僵局,Thread1在等待Thead2施放B资源,Thread2在等待Thread1释放A资源,两个进程就形成了一种僵局,下面以Java代码实现为例说明: public class DeadThread { private Thread thread1; public D
数据库死锁-解决死锁问题的三种办法
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
postgresql查询死锁以及杀死死锁进程sql.txt
查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql


