11

可能重复:
Malloc 线程安全?

在阅读“Linux 编程接口”时,我并没有感到困惑。

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

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

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

谁能给我解释一下?

4

2 回答 2

26

如果我们说可重入意味着它可以被多个调用者同时调用

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

lock(mutex);

/* Stuff. */

unlock(mutex):

如果它在解锁之前被中断并且其他人调用了会发生malloc什么?

  • 第一个上下文在第二个完成之前无法继续
  • 第二个上下文在互斥锁上阻塞并且在第一个解锁互斥锁之前无法继续

那是一个僵局。

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

又错了。请参见上面的示例。想象一下主程序正在执行一个malloc并且在函数实际结束之前你的处理程序调用 malloc。

于 2012-01-15T12:34:24.447 回答
2

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

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

于 2012-01-15T12:52:03.723 回答