线程堆和堆栈

问题描述:

在生成新线程的情况下如何分配内存,即内存堆,内存堆栈和线程是如何关联的?我知道这是根本(.net框架概念),但不知何故,我对这个概念并不了解。线程堆和堆栈

很难回答这个问题,因为.Net线程的实现方式。托管线程和相应的本地线程之间不一定有1-1实现。 CLR可以*使用多个本地线程来实现单个托管线程。因此,分配一个新的托管线程不一定会导致生成本地线程。它可以简单地假定现有的。

你能告诉我们为什么这是你关心的吗?也许这会让我们得到更好的答案。

+0

我觉得ms windows CLR线程的实现非常接近native。请指定非1-1映射的例子。 – Andrey 2010-03-15 16:20:53

+0

@Andrey不幸的是不是这种情况。考虑在2.0中添加Thread.ManagedThreadId。此属性是为了区分托管线程和潜在的许多本地支持者而精确添加的。 – JaredPar 2010-03-15 16:22:51

+0

@Andrey(续)当托管线程是一个STA我不相信CLR可以或将会改变本地线程,因为COM对象创建将具有线程亲和力的本地线程。但是在MTA中没有亲和力问题,CLR可以*更改后备本地线程。 – JaredPar 2010-03-15 16:23:44

每个线程都有自己的堆栈,但所有线程共享堆。

堆栈属于线程上下文。堆属于进程,因此它在线程之间共享。

它比.net更深层次。线程是OS本机对象。所谓的托管线程只是本地线程的包装。

所以回到你的问题。内存堆在相同进程的线程间共享,因为它们位于单个虚拟内存空间中。堆栈是个人的。