我听说"malloc是线程安全的,因为它提供了一个同步原语,因此同时malloc不会破坏堆".
但是当我在visual studio crt中查看malloc函数的源代码时,事实证明malloc函数只是将请求传递给系统调用HeapAlloc.所以我认为这是opearting系统本身提供某种同步来保护应用程序免受损坏的堆而不是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.)