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

kai*_*kai 11 c linux malloc multithreading reentrancy

可能重复:
Malloc线程安全吗?

在阅读"Linux编程接口"时,我并不感到困惑.

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

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

另一个问题是,由于malloc是线程安全的,我们可以把它放在信号处理程序中吗?我认为答案是肯定的,但我不确定,因为根据本书,它说只有一个可重入或异步信号安全的函数可以放在信号处理程序中.

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

cni*_*tar 24

如果我们说reentrant意味着它可以同时由多个调用者调用

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

lock(mutex);

/* Stuff. */

unlock(mutex):
Run Code Online (Sandbox Code Playgroud)

如果在解锁和别人打电话之前中间被中断,会发生什么malloc

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

那是一个僵局.

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

又错了.请参阅上面的示例.想象一下,主程序正在执行a malloc,在函数实际结束之前,处理程序调用malloc.