Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc线程安全吗?_C_Multithreading_Thread Safety_Malloc - Fatal编程技术网

malloc线程安全吗?

malloc线程安全吗?,c,multithreading,thread-safety,malloc,C,Multithreading,Thread Safety,Malloc,malloc()函数是否可重入?不,它不是 我在某处读到,如果使用-pthread编译,malloc将成为线程安全的。不过,我很确定它依赖于实现,因为malloc是ansic,而线程不是 如果我们谈论的是gcc: 编译并链接-pthread和 malloc()在x86上是线程安全的 和AMD64 另一种观点,更具洞察力 {malloc,calloc,realloc,free, glibc-2.2+的posix_memalign}是 线程安全 这取决于您使用的是哪个C运行时库实现。例如,如果您使

malloc()
函数是否可重入?

不,它不是


我在某处读到,如果使用-pthread编译,malloc将成为线程安全的。不过,我很确定它依赖于实现,因为malloc是ansic,而线程不是

如果我们谈论的是gcc:

编译并链接-pthread和 malloc()在x86上是线程安全的 和AMD64

另一种观点,更具洞察力

{malloc,calloc,realloc,free, glibc-2.2+的posix_memalign}是 线程安全


这取决于您使用的是哪个C运行时库实现。例如,如果您使用的是MSVC,那么有一个编译器选项可以让您指定要使用哪个版本的库来构建(即,一个运行时库,它通过胎面安全与否来支持多线程)。

否,它不是线程安全的。您的C库中实际上可能有一个
mallock()
mallock\u unlock()
函数。我知道这些是为Newlib库存在的。我不得不用它为我的处理器实现一个互斥,它在硬件上是多线程的。

问题:“malloc是可重入的吗?”
回答:不,不是。这里有一个关于什么构成例行程序的定义

malloc的任何常见版本都不允许您重新输入它(例如,从信号处理程序)。请注意,可重入例程可能不使用锁,并且几乎所有存在的malloc版本都使用锁(这使它们具有线程安全性)或全局/静态变量(这使它们具有线程不安全性和不可重入性)


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

以下是glibc的malloc.c中的摘录:

线程安全:线程安全,除非未定义线程


假设默认情况下没有定义任何线程,那么malloc至少在linux上是线程安全的。

这是一个很老的问题,我想根据当前的情况给大家带来新鲜感

是的,当前
malloc()
是线程安全的

从glibc-2.20[发布日期2014-09-07]的

void*malloc(大小)

初步报告:MT Safe |

。。。 1.2.2.1 POSIX安全概念:

。。。MT-Safe或线程安全函数在存在时可以安全调用 其他线程的。MT在MT Safe中表示多线程

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

可以跨库内联函数的整个程序优化 接口可能会暴露不安全的重新排序,从而执行内联 不建议跨越GNUC库接口。记录的 MT安全状态不保证井下程序优化。 但是,在用户可见标题中定义的函数被设计为 安全内联

是,在
malloc
下是线程安全的

2.9.1螺纹安全

POSIX.1-2008本卷定义的所有功能都应是线程安全的,但以下功能1不需要是线程安全的

[不包含
malloc
]的函数列表]


malloc和free是不可重入的,因为它们使用静态数据结构来记录哪些内存块是空闲的。因此,没有分配或释放内存的库函数是可重入的。

如果您使用GLIBC,答案是:是,但是

具体来说,是的,但是,请注意,虽然malloc和free是线程安全的,但调试函数不是

具体来说,非常有用的mtrace()、mcheck()和mprobe()函数不是线程安全的。在GNU项目中,您将看到一个最简短、最直接的答案,下面对此进行解释:

<> P>你需要考虑替代技术,如Ethy栅栏、ValgRink、DMALLC等。
因此,如果您的意思是“malloc()和free()函数是否线程安全”,那么答案是肯定的。但是如果你的意思是“整个malloc/free套件是线程安全的”,答案是否定的。

简短回答:是的,从C11开始,它是C标准的第一个版本,包含了线程的概念,
malloc
和朋友都必须是线程安全的。许多同时包含线程和C运行时的操作系统早在C标准之前就做出了这一保证,但我不准备对所有人发誓。但是,
malloc
和朋友不需要也从来没有被要求是可重入的

这意味着,可以从多个线程同时调用
malloc
free
,而无需担心锁定问题,只要不违反内存分配的任何其他规则(例如,对
malloc
返回的每个指针调用
free
一次且仅一次)。但是,从信号处理程序调用这些函数是不安全的,因为信号处理程序可能会中断处理信号的线程中对
malloc
free
的调用。有时,使用ISO C之外的功能,您可以保证处理信号的线程不会中断对
malloc
free
的调用,例如使用
sigprocmask
sigpaise