- 論壇徽章:
- 0
|
原帖由 yushang 于 2009-4-1 09:52 發(fā)表 ![]()
線程持有自旋鎖時(shí)為什么不能休眠呢
如果線程能休眠,那為什么不用信號(hào)量呢?
自旋鎖一般用于不能發(fā)生休眠(不會(huì)產(chǎn)生進(jìn)程上下文切換)的內(nèi)核路徑,比如中斷。
原帖由 yushang 于 2009-4-1 11:56 發(fā)表 ![]()
lock lock
... ...
/ lock
=> \ unlock
... ...
unlock unlock
假設(shè)線程被搶占或者中斷了,無(wú)論是哪種 ...
如果使用了自旋鎖,線程是不會(huì)發(fā)生內(nèi)核搶占的,可以看下自旋鎖的實(shí)現(xiàn):
在非SMP(UP)系統(tǒng)中:
- #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()禁止了內(nèi)核搶占
復(fù)制代碼
在SMP中
- #define spin_lock(lock) _spin_lock(lock)
- void __lockfunc _spin_lock(spinlock_t *lock)
- {
- preempt_disable();
- _raw_spin_lock(lock);
- }
- preempt_disable()禁止了內(nèi)核搶占
復(fù)制代碼
如果你怕中斷處理程序同時(shí)訪問(wèn)被中斷的進(jìn)程正在持有的自旋鎖,可以調(diào)用這樣的函數(shù):
- spin_lock_irqsave(lock, flags);
- spin_unlock_irqrestore(lock, flags) ;
復(fù)制代碼
這樣就萬(wàn)無(wú)一失了。 |
|