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

时间:2012-01-15 12:31:09

标签: c linux multithreading malloc reentrancy

  

可能重复:
  Malloc thread-safe?

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

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

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

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

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

2 个答案:

答案 0 :(得分:24)

  

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

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

lock(mutex);

/* Stuff. */

unlock(mutex):

如果在中间被中断,在解锁之前并且有人打电话给malloc会怎样?

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

这是一个僵局。

  

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

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

答案 1 :(得分:2)

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

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