2009-12-08 92 views
21

这是相当有据可查的,当.NET的自动垃圾收集器运行时,它将暂时中止与应用程序域相关的所有正在运行的托管线程。我无法发现的细节是关于发生垃圾回收时由应用程序创建的本地线程会发生什么情况(即使用_beginthreadex()而不是System.Threading.Thread())的详细信息。他们是否同样暂停或左边运行?.NET垃圾回收和原生线程

+1

道具的重大问题。 (道具++) – 2009-12-08 23:06:11

+0

另请参阅[这里](http://stackoverflow.com/questions/8404245/gc-behavior-and-clr-thread-hijacking)和[这里](https://msdn.microsoft.com/en -us /库/ 678ysw69.aspx)。 – Nicholas 2015-05-31 12:16:59

回答

20

请问this有帮助吗?

“A GC不会停止不属于线程 运行托管代码。由于这些 线程无法反正接触GC的 堆,没有必要为 GC与他们协调。”

“如果一个线程在托管代码,但 叫了原生代码,它将 继续运行,它会如果 它返回到托管代码停止。”

+0

+1尼斯链接。非常有趣的东西。希望您不介意,我编辑了您的帖子,以包含博客中的相关内容以防脱机。 – 2009-12-08 23:00:29

+2

这很有趣。为什么这些线程无法触及GC堆?那么'gcroot '和朋友呢? – 2009-12-08 23:00:57

+0

只要本地线程使用托管代码,它就向垃圾收集器注册。所以当GC运行时,线程暂停。只有当线程死亡,它才会被取消注册。 – 2009-12-08 23:02:10