malloc()是不可重入的,但是线程安全的?

可能重复:
Malloc线程安全?

当我正在阅读“Linux编程接口”时,我并不困惑。

从书中说,malloc是不可重入的,因为它操纵全局链表数据结构,但是通过使用互斥锁使它成为线程安全的。

我有点困惑:因为它是线程安全的使用互斥体,因此可以同时调用多个线程,为什么它不是一个可重入函数? (如果我们说可重入是指它可以同时被多个调用者调用)

另一个问题是,因为malloc是线程安全的,我们可以把它放在一个信号处理程序? 我认为答案是肯定的,但我不确定,因为根据这本书,它说,只有一个可重入或asynchronous信号安全function可以放在信号处理程序。

任何人都可以向我解释这个?

如果我们说可重入是指它可以同时被多个调用者调用

错误。 重入意味着你可以打断它,并在前一个化身结束之前再次调用它 。 想象一下malloc看起来像这样:

lock(mutex); /* Stuff. */ unlock(mutex): 

如果在解锁和其他人调用malloc 之前中间被中断,会发生什么?

  • 第一个上下文直到第二个上下文完成才能继续
  • 第二个上下文阻塞互斥体,直到第一个解锁互斥体后才能继续

这是一个僵局。

另一个问题是,因为malloc是线程安全的,我们可以把它放在一个信号处理程序? 我想答案是肯定的

又错了。 看上面的例子。 想象一下,主程序正在做一个malloc并且在函数实际结束处理程序调用malloc之前。

重入和线程安全是两个不同的概念。 可重入函数可以是非线程安全的,并且线程安全函数可以是不可重入的。

C中的库函数不保证是可重入的,只有信号处理程序可以调用重入函数。