- 论坛徽章:
- 0
|
既然在编译时,编译器能自动根据实际使用中CPU的个数来对这个函数(或宏定义)调节,那么我们写代码的时候,加上它肯定是不会有问题的? 回复 10# shi_wen_qiang
我不觉得编译器需要特别处理,因为在单cpu上面根本不会发生的事情,spin_lock_irqsave = local_irq_save,spin_lock,所以,单cpu后面的不会执行,也就无所谓。。。
在使用 spin_lock_irqsave 关闭中断后,如果在这么一点时间内,恰好来了一个中断被屏蔽了,等到 spin_unlock_irqrestore 的时候,这个中断应该不会丢失吧?
关中断只是IF置为为0,中断还是会传给cpu,只是cpu不响应,而且中断也有一个挽回机制,但是具体的我不懂|->
spin_lock_irqsave( A ) ;
.....
spin_lock_irqsave( B ) ;
...
spin_unlock_irqrestore( B ) ;
....
spin_unlock_irqrestore( A ) ;
================
我自己的理解:
如果在多 CPU 的环境中,这样写法是没有问题的,因为A,B代表两个不同的资源。
这个必然有问题,只要是两把锁都会产生死锁:如果另外一个cpu:
spin_lock_irqsave(B),spin_lock_irqsave(A),你只是关闭本地cpu中断,其他cpu还是可以执行中断的。。。
如果按照上面大家讨论的结论:自旋锁只对多CPU时才是有用的,那么对于单 CPU 时,有没有那种普通的锁?大家也知道,在中断处理程序中,是不能使用信号量来对资源进行控制的,应该使用锁,那对于单CPU,在中断处理程序中,应该使用什么样的锁?
关闭中断不够?
问题:通过上面粉色的字,可以看出,只要使用“锁”和“中断”,那么就会自动禁止内核抢占,这里的锁指的也是“自旋锁”吧?
这个应该是翻译的问题,自旋锁就是保护多cpu同步的,不要想多了。 |
|