In glibc, malloc
is implemented with arenas。
因此,例如,线程A中由malloc
和后来free
d首先分配的内存可能无法被线程B中的另一个malloc
调用使用,因为线程A B可以在不同的场地,不同的场地保持不同的堆和自由的记忆列表。
说到C ++(也许是C ++ 11,因为C ++ 11有一个新标准),故事是否仍然相同?
或者不同的线程实际上共享相同的堆段和空闲的内存列表,并且new
在一个线程中可以先由另一个线程分配内存new
和更晚delete
d ?
如果答案是依赖于实现的,那么问题是它们是如何在主要的C ++编译器中实现的,例如g ++,MVC ++,icc?
修改
我认为这个问题在某种意义上是有效的,有时你会推出很多 线程并在每个线程中为大量对象动态分配/释放大块内存,并且您不希望应用程序的内存使用量高得离谱。
答案 0 :(得分:2)
此:
不同的线程实际上共享相同的堆段和空闲的内存列表,并且一个线程中的new可以分配先创建的内存,然后再由另一个线程删除
线程的目的 - 共享内存空间。如果您不需要此功能,则最好使用流程。
答案 1 :(得分:1)
C ++ std和你使用的分配器实现是两个不同的东西..如果你使用gcc编译你的C ++代码,它默认使用glibc作为分配器。因此,如果你的gcc是一个更新的版本,它使用glibc与每个线程的竞技场,你很高兴。
答案 2 :(得分:0)
这取决于。在Windows上,不允许使用DLL的线程将一个DLL中分配的内存所有权转移到另一个DLL。所有新闻和删除必须在DLL的“同一侧”执行。虽然这不是严格的线程问题,但它仍然暗示线程不能简单地将内存所有权转移到任何其他线程而不知道内存源自何处。
请参阅Do (statically linked) DLLs use a different heap than the main program?