3 回答
TA贡献1834条经验 获得超8个赞
问题:“是malloc reentrant”吗?
答:不,不是。以下是使例程重入的定义。
malloc的常见版本都不允许您重新输入它(例如,来自信号处理程序)。请注意,可重入例程可能不使用锁,并且现有的几乎所有malloc版本都使用锁(这使它们成为线程安全的)或全局/静态变量(这使得它们不是线程不安全且不可重入)。
到目前为止,所有的答案都回答“是malloc线程安全吗?”,这是一个完全不同的问题。对于这个问题,答案是它取决于你的运行时库,也可能取决于你使用的编译器标志。在任何现代UNIX上,默认情况下您将获得一个线程安全的malloc。在Windows中,使用/MT
,/MTd
,/MD
或/MDd
标志来获得线程安全的运行时库。
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安全状态。但是,用户可见标头中定义的功能旨在安全地进行内联。
- 3 回答
- 0 关注
- 1104 浏览
添加回答
举报