Possible Duplicate:
Malloc thread-safe?
在阅读《Linux 编程接口(interface)》时,我一点儿也不糊涂。
书上说 malloc 是不可重入的,因为它操纵全局链表数据结构,但通过使用互斥锁使其成为线程安全的。
我对此有点困惑:既然使用互斥锁是线程安全的,因此可以同时被多个线程调用,为什么它不是可重入函数? (如果说可重入就是可以同时被多个调用者调用)
另一个问题是,既然 malloc 是线程安全的,我们可以把它放在一个信号处理程序中吗?
我认为答案是肯定的,但我不确定,因为根据这本书,它说信号处理程序中只能放置可重入或异步信号安全函数。
谁能给我解释一下?
if we say that reentrant means that it can be invoked by more than one
caller at the same time
错了。可重入的意思是你可以打断它,在上一次化身结束之前再次调用它。想象一下 malloc 看起来像这样:
lock(mutex);
/* Stuff. */
unlock(mutex):
如果它在中间被中断,解锁之前 并且其他人调用了 malloc
会怎样?
- 在第二个上下文完成之前,第一个上下文无法继续
- 第二个上下文阻塞在互斥量上,并且在第一个解锁互斥量之前无法继续
这是一个僵局。
Another question is that, since malloc is thread-safe, can we put it
in a signal handler? I think the answer is yes
又错了。请参见上面的示例。想象一下主程序正在执行 malloc
并且在函数实际结束之前您的处理程序调用 malloc。