我听说“malloc 是线程安全的,因为它提供了一个同步原语,因此同时到 malloc 不会破坏堆”。
但是当我在visual studio crt中查看malloc函数的源代码时,发现malloc函数只是将请求传递给syscall HeapAlloc。所以我认为是操作系统本身提供了某种同步来保护应用程序免受损坏的堆而不是malloc。
那么Linux呢?malloc 本身是否提供某种同步?
我听说“malloc 是线程安全的,因为它提供了一个同步原语,因此同时到 malloc 不会破坏堆”。
但是当我在visual studio crt中查看malloc函数的源代码时,发现malloc函数只是将请求传递给syscall HeapAlloc。所以我认为是操作系统本身提供了某种同步来保护应用程序免受损坏的堆而不是malloc。
那么Linux呢?malloc 本身是否提供某种同步?
谈到这一点的唯一标准是 C11(因为之前没有多线程的概念),它说 (7.22.3/2):
为了确定数据竞争的存在,内存分配函数的行为就像它们只访问可通过其参数访问的内存位置,而不是其他静态持续时间存储。但是,这些函数可能会明显地修改它们分配或取消分配的存储空间。对内存区域的调用
free
或realloc
取消分配内存区域p
的调用与分配全部或部分区域的任何分配调用同步p
。此同步发生在解除分配函数的任何访问之后p
,以及分配函数的任何此类访问之前。
简而言之,“一切都好”。
但是,像 Linux 这样的特定实现肯定会在很长一段时间内提供自己的强有力的保证(因为ptmalloc2
我认为),而且基本上一直没问题。[更新,感谢@ArjunShankar:Posix 确实需要malloc
线程安全。]
(但请注意,Google 等其他实现tcmalloc
可能在多线程应用程序中具有更好的性能。)
(对于 C++,请参阅 C++11:18.6.1.4。)