可能重复:
Malloc线程安全?
当我正在阅读“Linux编程接口”时,我并不困惑。
从书中说,malloc是不可重入的,因为它操纵全局链表数据结构,但是通过使用互斥锁使它成为线程安全的。
我有点困惑:因为它是线程安全的使用互斥体,因此可以同时调用多个线程,为什么它不是一个可重入函数? (如果我们说可重入是指它可以同时被多个调用者调用)
另一个问题是,因为malloc是线程安全的,我们可以把它放在一个信号处理程序? 我认为答案是肯定的,但我不确定,因为根据这本书,它说,只有一个可重入或asynchronous信号安全function可以放在信号处理程序。
任何人都可以向我解释这个?
如果我们说可重入是指它可以同时被多个调用者调用
错误。 重入意味着你可以打断它,并在前一个化身结束之前再次调用它 。 想象一下malloc看起来像这样:
lock(mutex); /* Stuff. */ unlock(mutex):
如果在解锁和其他人调用malloc
之前中间被中断,会发生什么?
这是一个僵局。
另一个问题是,因为malloc是线程安全的,我们可以把它放在一个信号处理程序? 我想答案是肯定的
又错了。 看上面的例子。 想象一下,主程序正在做一个malloc
并且在函数实际结束处理程序调用malloc之前。
重入和线程安全是两个不同的概念。 可重入函数可以是非线程安全的,并且线程安全函数可以是不可重入的。
C中的库函数不保证是可重入的,只有信号处理程序可以调用重入函数。