首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程有不同的堆吗?

线程有不同的堆吗?
EN

Stack Overflow用户
提问于 2009-11-03 13:30:45
回答 6查看 66.7K关注 0票数 122

据我所知,当操作系统创建线程时,每个线程都会得到一个不同的堆栈。我想知道是否每个线程本身也有一个不同的堆?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-11-03 13:33:18

不是的。所有线程共享一个公共堆。

每个thread has a private stack,它可以快速添加和删除项目。这使得基于堆栈的内存更快,但是如果你使用了太多的堆栈内存,就像无限递归中发生的那样,你会得到堆栈溢出。

由于所有线程共享同一堆,因此必须同步对分配器/解除分配器的访问。有各种方法和库可以避免allocator contention

某些语言允许您创建私有内存池或单独的堆,您可以将这些内存池分配给单个线程。

票数 136
EN

Stack Overflow用户

发布于 2009-11-03 14:33:22

默认情况下,C只有一个堆。

也就是说,一些线程感知的分配器将对堆进行分区,以便每个线程都有自己的区域可供分配。这个想法是,这应该使堆的伸缩性更好。

Hoard就是这种堆的一个例子。

票数 9
EN

Stack Overflow用户

发布于 2009-11-06 02:17:07

取决于操作系统。windows和unices上的标准c运行时跨线程使用共享堆。这意味着锁定所有malloc/free。

例如,在Symbian上,每个线程都有自己的堆,尽管线程可以共享指向任何堆中分配的数据的指针。在我看来,Symbian的设计更好,因为它不仅在alloc/free期间消除了锁定的需要,而且鼓励对线程之间的数据所有权进行清晰的规范。在这种情况下,当线程死亡时,它会获得它分配的所有对象-也就是说,它不能泄漏它已经分配的对象,这是在内存受限的移动设备中具有的一个重要属性。

Erlang还遵循类似的设计,其中“进程”充当垃圾收集的一个单元。除了引用计数的二进制blob(我认为)之外,所有数据都通过复制在进程之间进行通信。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1665419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档