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

标签 c linux multithreading malloc reentrancy

<分区>

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。

关于c - malloc() 是不可重入但线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8869622/

相关文章:

c - 在linux平台上使用c在服务器和两个客户端之间建立蓝牙微微网连接?

c - 让 select 和 xcb_poll_for_event 一起工作的安全方法?

linux - 设置本地SVN

objective-c - Objective-C 的 NSMutableArray 是线程安全的吗?

java - 线程中出现异常 "JavaFX Application Thread"java.lang.OutOfMemoryError : Java heap space

c - C中Typedef结构体的使用

c++ - 访问硬编码数组和运行时初始化数组之间是否存在任何性能差异?

linux - 生成下百个 ip 地址的 Shell 脚本

linux - 运行 awk 命令删除最后一列后保留分隔符 '\t'

java - JNI 线程创建