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

时间:2010-12-24 05:33:51

标签: c++ multithreading malloc openmp

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

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

4 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:6)

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

现代malloc实现尽可能通过为每个线程保留单独的“竞技场”来实现无锁定。

答案 3 :(得分:5)

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