2015-07-04 48 views
10

In glibc, malloc is implemented with arenas。 因此,例如,线程A中由malloc和之后的free d首先分配的存储器有可能不能由线程B中的另一个malloc调用使用,因为线程A和B可能位于不同的场所中,并且不同的场合保持不同的堆和空闲的内存列表。在C++中,可以在一个线程中分配由另一个线程删除的内存吗?

当涉及到C++(也许C++ 11自C++ 11有一个新标准以来),故事仍然是一样的吗?

或者不同的线程实际上共享同一段堆和空闲内存列表,并且new在一个线程中可以先分配内存new ed和更高版本delete d由另一个线程?

如果答案是依赖于实现的,那么问题是它们如何在主要的C++编译器中实现,比如g ++,MVC++,icc?

编辑

我认为这个问题是在这个意义上有效的,有时你推出许多 线程,每个线程,动态分配/解除分配的内存大块的大量的对象,而你不希望应用程序的内存使用率高得离谱。

+1

C++没有指定如何实现分配函数,只是他们必须产生什么结果。 –

+0

在实践中'new'调用'malloc'。但目前还不清楚你希望如何处理这些信息。 –

+0

你的意思是'new'是由'malloc'实现的吗?这是标准化的吗? – Allanqunzi

回答

2

此:

不同的线程实际上共享堆和内存空闲列表的同一网段,并在一个线程新的可分配内存第一newed,后来被另一个线程

删除线程的目的 - 共享内存空间。如果你不需要这个功能,你最好使用过程。

+0

请注意,在C中,某些线程可用的可用内存空间可能无法被其他线程访问。我在问C++中的行为,我不是在谈论像访问跨越不同线程的变量。 – Allanqunzi

+0

@Allanqunzi - 如果是这样的话,不要打扰线程,因为它们相对于进程的主要优势是更容易的内部通信。 –

0

这取决于。在Windows上,不允许使用DLL的线程将在一个DLL中分配的内存所有权转移给另一个DLL。所有新闻和删除必须在DLL的“同一侧”执行。尽管这不是严格的线程问题,但它仍然暗示着线程不能简单地将内存所有权转移给任何其他线程而不知道内存的起源。

Do (statically linked) DLLs use a different heap than the main program?

+2

没有“基于DLL的线程”这样的事情。通过“new”在DLL中分配的内存不能通过“delete”在另一个DLL或主应用程序中解除分配 - 这与线程无关。 – immibis

+0

我改变了从“基于DLL的线程”到“使用DLL的线程”的措辞,因为这就是我的意思。 –

+0

如果使用相同的编译器和标志编译DLL,则释放在另一个DLL中分配的内存时没有问题。 –

1

C++性病您使用分配器执行是两回事。如果您使用gcc来编译你的C++代码,它默认使用的glibc的分配器。所以如果你的gcc是一个足够新的版本,它使用glibc和per-thread arenas,你很好去。

相关问题