- 论坛徽章:
- 0
|
原帖由 yushang 于 2009-4-1 09:52 发表
线程持有自旋锁时为什么不能休眠呢
如果线程能休眠,那为什么不用信号量呢?
自旋锁一般用于不能发生休眠(不会产生进程上下文切换)的内核路径,比如中断。
原帖由 yushang 于 2009-4-1 11:56 发表
lock lock
... ...
/ lock
=> \ unlock
... ...
unlock unlock
假设线程被抢占或者中断了,无论是哪种 ...
如果使用了自旋锁,线程是不会发生内核抢占的,可以看下自旋锁的实现:
在非SMP(UP)系统中:
- #define spin_lock(lock) _spin_lock(lock)
- #define _spin_lock(lock) __LOCK(lock)
- #define __LOCK(lock) \
- do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)
- preempt_disable()禁止了内核抢占
复制代码
在SMP中
- #define spin_lock(lock) _spin_lock(lock)
- void __lockfunc _spin_lock(spinlock_t *lock)
- {
- preempt_disable();
- _raw_spin_lock(lock);
- }
- preempt_disable()禁止了内核抢占
复制代码
如果你怕中断处理程序同时访问被中断的进程正在持有的自旋锁,可以调用这样的函数:
- spin_lock_irqsave(lock, flags);
- spin_unlock_irqrestore(lock, flags) ;
复制代码
这样就万无一失了。 |
|