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内核驱动,有很多地方不理解,求请教。