线程有不同的堆吗?

112 c linux windows stack multithreading

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

bri*_*gge 123

不.所有线程共享一个公共堆.

每个线程都有一个私有堆栈,可以快速添加和删除项目.这使得基于堆栈的内存很快,但是如果你使用太多的堆栈内存,就像在无限递归中那样,你将获得堆栈溢出.

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

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

  • 每个线程都有自己的堆栈的*main*原因是线程实际上可以做某事(比如调用函数)...... (10认同)
  • 通常线程共享资源,例如内存,因此任何非脑死线程实现都会共享堆. (5认同)
  • 每个线程都有一个单独的堆栈,但它不一定是"私有的".通常允许其他线程访问它. (3认同)
  • @crisron可以为每个线程设置一个单独的堆,但是如果你这样做而不是使用默认的共享堆,那么例如线程A就很难分配缓冲区,用数据填充它,将它传递给线程B ,并让线程B使用数据然后释放缓冲区(因为线程B无法访问线程A的堆,线程B无法释放缓冲区;最好的线程B可以做的是将缓冲区传递回线程A再次,让线程A免费吧). (2认同)

R S*_*hko 9

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

也就是说,一些线程感知的分配器将对堆进行分区,以便每个线程都有自己的区域来分配.这个想法是,这应该使堆扩展更好.

这种堆的一个例子是Hoard.

  • 更新:从 C++11 开始,线程不再是实现定义的。 (2认同)

Sri*_*mar 5

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

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

Erlang也遵循类似的设计,其中"进程"充当垃圾收集的单元.所有数据都是通过复制在进程之间传递的,除了引用计数的二进制blob(我认为).