2010-03-15 192 views
7

在生成新線程的情況下如何分配內存,即內存堆,內存堆棧和線程是如何關聯的?我知道這是根本(.net框架概念),但不知何故,我對這個概念並不瞭解。線程堆和堆棧

回答

2

很難回答這個問題,因爲.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

0

每個線程都有自己的堆棧,但所有線程共享堆。

1

堆棧屬於線程上下文。堆屬於進程,因此它在線程之間共享。

1

它比.net更深層次。線程是OS本機對象。所謂的託管線程只是本地線程的包裝。

所以回到你的問題。內存堆在相同進程的線程間共享,因爲它們位於單個虛擬內存空間中。堆棧是個人的。