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