在多线程C/C++中,malloc/new在分配内存时会锁定堆

Jan*_*sky 24 c++ malloc multithreading openmp

我很好奇,如果两个线程同时请求分配内存,是否存在内存分配锁定.我正在使用OpenMP来执行多线程,C++代码.

操作系统:主要是Linux,但也想了解Windows和Mac.

Kir*_*sky 14

在某些实现中可能会有改进,例如创建特定于线程的缓存(在这种情况下,小块的分配将是无锁的).例如,来自谷歌.但总的来说,是的,内存分配存在锁定.


Jim*_*imR 7

默认情况下,Windows在您使用Win API堆函数时会锁定堆.

您可以至少在创建堆时控制锁定.不同的编译器和C运行时使用malloc/free系列做不同的事情.例如,SmartHeap API在某一点上为每个线程创建了一个堆,因此不需要锁定.还有配置选项可以打开和关闭该行为.

在90年代早期/中期的某个时刻,Borland Windows和OS/2编译器明确地关闭了堆锁(一个过早的优化错误),直到使用beginthread启动了多个线程.许多人试图用OS API调用生成线程,然后当堆损坏自己到地狱时感到很惊讶......


MK.*_*MK. 6

http://en.wikipedia.org/wiki/Malloc

现代malloc实现尝试通过为每个线程保持单独的"竞技场"来尽可能无锁.

  • 无论该链接是否具有权威性,该链接都很有用.我们不是在这里写学术论文. (15认同)
  • 维基百科不是[权威来源](http://chronicle.com/blogs/wiredcampus/wikipedia-founder-discourages-academic-use-of-his-creation/2305):无论如何都要用它作为起点.学习和寻找权威来源.但它不应该被引用,因为它不是权威来源. (4认同)

wat*_*180 5

免费商店是共享资源,必须同步.分配/解除分配成本很高.如果您是多线程的性能,那么频繁的分配/释放可能会成为瓶颈.作为一般规则,避免紧密循环内的分配/释放.另一个问题是虚假分享.