为了账号安全,请及时绑定邮箱和手机立即绑定

malloc线程安全吗?

malloc线程安全吗?

C
素胚勾勒不出你 2019-08-27 10:46:31
malloc线程安全吗?malloc()功能是否可重入?
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

问题:“是malloc reentrant”吗?
答:不,不是。以下是使例程重入的定义。

malloc的常见版本都不允许您重新输入它(例如,来自信号处理程序)。请注意,可重入例程可能不使用锁,并且现有的几乎所有malloc版本都使用锁(这使它们成为线程安全的)或全局/静态变量(这使得它们不是线程不安全不可重入)。

到目前为止,所有的答案都回答“是malloc线程安全吗?”,这是一个完全不同的问题。对于这个问题,答案是它取决于你的运行时库,也可能取决于你使用的编译器标志。在任何现代UNIX上,默认情况下您将获得一个线程安全的malloc。在Windows中,使用/MT/MTd/MD/MDd标志来获得线程安全的运行时库。


查看完整回答
反对 回复 2019-08-27
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

这是一个非常古老的问题,我希望根据当前的状况带来新鲜感。

是的,目前malloc()是线程安全的。

GNU C库参考手册glibc-2.20 [released 2014-09-07]

void * malloc (size_t size)

初步:MT-Safe | ...

...... 1.2.2.1 POSIX安全概念:

... MT-Safe或线程安全功能可以在其他线程存在的情况下安全地调用。在MT-Safe中,MT代表Multi Thread。

MT-Safe并不意味着函数是原子的,也不是它使用POSIX向用户公开的任何内存同步机制。甚至可能按顺序调用MT-Safe功能也不会产生MT-Safe组合。例如,让一个线程一个接一个地调用两个MT-Safe函数并不能保证等同于两个函数组合的原子执行的行为,因为其他线程中的并发调用可能以破坏性方式干扰。

可以跨库接口内联函数的整个程序优化可能会暴露不安全的重新排序,因此不建议在GNU C库接口上执行内联。在全程序优化下,无法保证记录的MT安全状态。但是,用户可见标头中定义的功能旨在安全地进行内联。


查看完整回答
反对 回复 2019-08-27
  • 3 回答
  • 0 关注
  • 1104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信