bri*_*gge 123
不.所有线程共享一个公共堆.
每个线程都有一个私有堆栈,可以快速添加和删除项目.这使得基于堆栈的内存很快,但是如果你使用太多的堆栈内存,就像在无限递归中那样,你将获得堆栈溢出.
由于所有线程共享同一个堆,因此必须同步对allocator/deallocator的访问.有各种方法和库可以避免分配器争用.
某些语言允许您创建私有内存池或单个堆,您可以将其分配给单个线程.
取决于操作系统.Windows和unices上的标准c运行时使用跨线程的共享堆.这意味着锁定每个malloc/free.
例如,在Symbian上,每个线程都有自己的堆,尽管线程可以共享指向任何堆中分配的数据的指针.在我看来,Symbian的设计更好,因为它不仅消除了在alloc/free期间锁定的需要,而且还鼓励在线程之间清晰地指定数据所有权.同样在这种情况下,当线程死亡时,它会获取它随之分配的所有对象 - 即它不会泄漏已分配的对象,这是具有受限内存的移动设备中的重要属性.
Erlang也遵循类似的设计,其中"进程"充当垃圾收集的单元.所有数据都是通过复制在进程之间传递的,除了引用计数的二进制blob(我认为).