2011-03-07 56 views

回答

3

内核抢占并不能保证你没有死锁。

一个线程仍然可以保持一个锁而不会释放它,并且如果某个其他线程想要获取同一个锁,这仍然会导致死锁。持有锁的线程必须决定释放它以避免死锁。也就是说,线程或其他逻辑必须抢占线程使其释放锁。内核本身不会导致线程释放锁。

内核只是可以安排其他线程运行,但如果某个其他线程依赖于第一个线程完成,那么该线程也会被阻塞。

例如:

线程A正在等待该线程B已经获得了一些共享资源的锁定。

线程获取的抢占和线程B得到安排。

线程B正在等待锁定某个共享资源线程A正在等待锁定。

死锁。线程A和线程B都不能取得进展。

要打破僵局,必须先取消线程A或B才能释放它的锁定。内核抢占不能做到这一点。

+0

线程可能仍然保持一个锁而不释放它,这仍然会导致死锁。我不同意。如果其他线程需要锁,它可能会导致死锁。但是可能存在一个只在某些条件下共享的锁,并且当它不被共享时,线程可以继续保持它(作为优化)。说“未能释放锁定会导致死锁”有点过于强大。 –

+0

@Ben:同意。稍后我会澄清在什么情况下会出现僵局。但是,你的观点是有效的。我会修改评论以使其更清楚。谢谢。 –