【问题标题】:A thread who is spinning and trying to get the spinlock can't be preempted?一个正在旋转并试图获得自旋锁的线程不能被抢占?
【发布时间】:2015-11-26 19:15:17
【问题描述】:

当 Linux 上的线程正在旋转并试图获取自旋锁时,该线程是否没有机会被抢占?

编辑:
我只是想确定一些事情。在“UP”系统上,没有中断处理程序会访问这个自旋锁。如果正在旋转并试图获取自旋锁的线程可以被抢占,我认为在这种情况下,自旋锁保护的临界区可以调用sleep,因为持有自旋锁的线程可以重新调度回 CPU。

【问题讨论】:

  • @ChristopherCreutzig:只需更新 OP。
  • @ChristopherCreutzig:我遇到了这个topic,所以想知道如果允许持有自旋锁的线程可以休眠,必须满足哪些条件。所以如果在UP系统上可以抢占竞争的spinlock线程,那么持有spinlock的线程可以重新调度释放spinlock,竞争的spinlock线程可以获得spinlock。

标签: linux multithreading linux-kernel linux-device-driver


【解决方案1】:

不,它不能被抢占:查看代码(取自 linux 源代码)http://lxr.free-electrons.com/source/include/linux/spinlock_api_smp.h?v=2.6.32#L241

241 static inline unsigned long __spin_lock_irqsave(spinlock_t *lock)
242 {
243         unsigned long flags;
244 
245         local_irq_save(flags);
246         preempt_disable();
247         spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
248         /*
249          * On lockdep we dont want the hand-coded irq-enable of
250          * _raw_spin_lock_flags() code, because lockdep assumes
251          * that interrupts are not re-enabled during lock-acquire:
252          */
253 #ifdef CONFIG_LOCKDEP
254         LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
255 #else
256         _raw_spin_lock_flags(lock, &flags);
257 #endif
258         return flags;
259 }
260 
[...]
349 static inline void __spin_unlock(spinlock_t *lock)
350 {
351         spin_release(&lock->dep_map, 1, _RET_IP_);
352         _raw_spin_unlock(lock);
353         preempt_enable();
354 }

参见第 246 和 353 行

顺便说一句,拿着锁(不管是否自旋锁)睡觉通常是个坏主意

【讨论】:

  • 是的,在锁期间睡觉几乎违背了锁本身的全部目的......要么解锁并睡觉,要么根本不睡觉,这就是那里的编程基础
猜你喜欢
  • 2011-03-23
  • 2017-03-12
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多