在linux内核中,如果在持有自旋锁的情况下启用了内核抢占,那么死锁怎么会发生呢?
答案 0 :(得分:4)
内核抢占并不能保证您没有死锁。
线程可能仍然保持锁定而不释放它,如果某个其他线程想要获取同一个锁,那么仍然会导致死锁。持有锁的线程必须决定释放它以避免死锁。也就是说线程或其他一些逻辑必须抢占线程和使其释放锁。内核本身不能导致线程释放锁。
内核只是可以安排其他线程运行,但如果某个其他线程依赖于第一个线程完成,那么该线程也会被阻塞。
例如:
线程A正在等待线程B获取的某些共享资源的锁定。
线程A获取被抢占,线程B被安排。
线程B正在等待锁定某个共享资源线程A正在持有。
死锁。线程A和线程B都不能取得进展。
要打破僵局,必须先取消线程A或B以释放它的锁定。内核抢占无法做到这一点。