2010-07-29 48 views

回答

23

可以随时调用信号处理程序,包括在另一次调用malloc时正在进行的时间。如果发生这种情况,将会发生以下两种情况之一:

  1. 你的过程将死锁讯号处理器中,因为malloc将无法​​获取堆锁。
  2. 你的进程会破坏它的堆,因为malloc确实获得锁(或者不认为它需要它),然后继续渲染堆不一致,导致以后崩溃。
+0

有趣。但是你能解释为什么在正常的线程上下文切换过程中不能发生这种情况吗该堆也在进程中的所有线程之间共享。除了在信号处理程序调用期间malloc()不是pre-emptable吗? – 2010-07-29 19:59:02

+9

这是旧的,但值得回答:当信号到达时,它在进程内的一个线程内被处理。我能想到的最简单的情况是线程在调用malloc时捕获一个信号(可以说,在它获得一个锁之后)。然后,信号处理程序调用malloc。当它试图获取锁时,它会看到锁已被占用,所以它等待锁。最终释放锁的线程部分永远不会运行,因为它正在等待信号处理程序完成。信号处理程序永远不会完成,因为它正在等待锁定 – 2011-05-11 22:11:46

+0

这就是死锁问题。当持有的锁重入时,会发生腐败问题。在这种情况下,信号处理程序*能够获得锁(因为它是由同一个线程保存的),并且继续使用堆,因为它正在执行一个全新的malloc请求,而现有的请求(在同一个线程上线程)已经在进行中。没有信号就不会发生这种情况,因为其他线程使用锁来进行协调。 – BeeOnRope 2014-02-13 01:59:35