malloc本身是否提供某种同步?

时间:2012-10-09 00:46:35

标签: c multithreading

我听说“malloc是线程安全的,因为它提供了一个同步原语,因此同步到malloc不会破坏堆”。

但是当我在visual studio crt中查看malloc函数的源代码时,事实证明malloc函数只是将请求传递给了系统调用HeapAlloc。所以我认为这是opearting系统本身提供某种同步来保护应用程序免受损坏的堆而不是malloc。

那么linux怎么样? malloc本身是否提供某种同步?

1 个答案:

答案 0 :(得分:5)

唯一能说明这一点的标准是C11(因为以前没有多线程的概念),它说(7.22.3 / 2):

  

为了确定是否存在数据争用,内存分配功能   表现得好像他们只访问通过他们可访问的内存位置   参数而不是其他静态持续时间存储。然而,这些功能可能是明显的   修改他们分配或取消分配的存储。拨打freerealloc的电话   解除分配区域p的内存与分配全部的任何分配调用同步   或部分地区p。在p访问ptmalloc2之后发生此同步   解除分配函数,并在分配函数进行任何此类访问之前。

简而言之,“一切都很好”。

然而,像Linux这样的特定实现肯定会提供他们自己的,强有力的保证很长一段时间(因为我认为malloc),它基本上一直很好。 [更新,感谢@ArjunShankar:Posix确实要求tcmalloc是线程安全的。]

(请注意,其他实现,例如Google的{{1}}可能在多线程应用程序中具有更好的性能。)

(对于C ++,参见C ++ 11:18.6.1.4。)