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

26

我想知道如果两个线程同时请求分配内存时,是否存在内存分配锁。我正在使用OpenMP进行多线程编程,使用C++代码。

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


2
你是否担心两个线程会被分配相同的内存?如果是,那么你不需要担心。如果malloc不是线程安全的,你不会是第一个发现它的人。如果你的问题是如何实现malloc的线程安全性,那就取决于具体的实现方式。 - EnabrenTane
我的问题更多与在并行线程中分配时的性能有关。 - Janik Zikovsky
4个回答

15

某些实现方式可以进行改进,例如创建线程特定缓存(在这种情况下,小块分配将会无锁)。例如,来自Google的这个。但是总体而言,是存在内存分配锁的。


7

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

您可以在堆创建时控制锁定。不同的编译器和C运行时对malloc/free系列函数的处理方式不同。例如,SmartHeap API曾经为每个线程创建一个堆,因此不需要锁定。还有一些配置选项可用于打开或关闭该行为。

在90年代初/中期,Borland Windows和OS/2编译器明确关闭了堆锁定(过早优化错误),直到使用beginthread启动多个线程。许多人尝试使用OS API调用生成线程,然后惊讶地发现堆损坏了...


5

5
维基百科不是权威来源:可以将其用作学习和查找权威来源的起点。但是,由于不是权威来源,不应引用维基百科。请注意,维基百科内容可能有误、不完整或过时。 - Martin York
18
这个链接很有用,无论它是否权威。我们这里不是在写学术论文。 - Brent Bradburn

5

自由存储是一种共享资源,必须进行同步。分配/释放的成本很高。如果您为了性能而使用多线程,则频繁的分配/释放可能会成为瓶颈。通常情况下,避免在紧密循环内部进行分配/释放。另一个问题是虚假共享。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接