linux - 正在旋转并试图获得自旋锁的线程不能被抢占吗?

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

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

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

最佳答案

不,它不能被抢占:请参阅代码(取自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 行

顺便说一句,在持有锁(无论是否自旋锁)的情况下 sleep 通常是一个坏主意

关于linux - 正在旋转并试图获得自旋锁的线程不能被抢占吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33934621/

相关文章:

linux - 在tmux中绑定(bind)Ctrl+Tab和Ctrl+Shift+Tab

multithreading - Lua:Lua 中具有线程结构的抢占式(非合作式)多任务处理

java - 如何防止共享同一个对象?

更新到 2.3 后的 Android AVD 错误

linux - ELF 格式 : is ELF a subset of . o/.so 还是 ELF 基本上是整个 .o/.so?

c++ - 如果我编写一段代码,其中每个线程修改数组的完全不同部分,这会保持缓存一致性吗?

Linux 内核 : Building Out-of-tree module for kernel , 但 apt-cache 搜索中没有 linux-headers

linux-kernel - 文件结构中的linux内核完整路径

linux - 为什么我在使用 linux hrtimer 进行一秒回调时会出现时间漂移?

linux - 适用于 Linux 的最小 Xwindow