据我所知,当操作系统创建线程时,每个线程都会得到一个不同的堆栈。我想知道是否每个线程本身也有一个不同的堆?
发布于 2009-11-03 13:33:18
不是的。所有线程共享一个公共堆。
每个thread has a private stack,它可以快速添加和删除项目。这使得基于堆栈的内存更快,但是如果你使用了太多的堆栈内存,就像无限递归中发生的那样,你会得到堆栈溢出。
由于所有线程共享同一堆,因此必须同步对分配器/解除分配器的访问。有各种方法和库可以避免allocator contention。
某些语言允许您创建私有内存池或单独的堆,您可以将这些内存池分配给单个线程。
发布于 2009-11-03 14:33:22
发布于 2009-11-06 02:17:07
取决于操作系统。windows和unices上的标准c运行时跨线程使用共享堆。这意味着锁定所有malloc/free。
例如,在Symbian上,每个线程都有自己的堆,尽管线程可以共享指向任何堆中分配的数据的指针。在我看来,Symbian的设计更好,因为它不仅在alloc/free期间消除了锁定的需要,而且鼓励对线程之间的数据所有权进行清晰的规范。在这种情况下,当线程死亡时,它会获得它分配的所有对象-也就是说,它不能泄漏它已经分配的对象,这是在内存受限的移动设备中具有的一个重要属性。
Erlang还遵循类似的设计,其中“进程”充当垃圾收集的一个单元。除了引用计数的二进制blob(我认为)之外,所有数据都通过复制在进程之间进行通信。
https://stackoverflow.com/questions/1665419
复制相似问题