【发布时间】:2023-04-06 07:21:01
【问题描述】:
我正在阅读CLR via C# 一书中关于 GC 的内容,特别是关于 CLR 何时想要开始收集的内容。我知道它必须在收集发生之前暂停线程,但它提到当线程指令指针到达安全点时它必须这样做。在它不在安全点的情况下,它会尝试快速到达一个点,并通过hijacking 线程(在线程堆栈中插入一个特殊的函数指针)来实现。这一切都很好,但我认为默认托管线程是安全的?
我最初认为它可能指的是非托管线程,但 CLR 允许非托管线程继续执行,因为任何正在使用的对象都应该被固定。
那么,托管线程中的safe point 是什么,GC 如何确定它是什么?
编辑:
我认为我说得不够具体。根据this MSDN article,即使调用Thread.Suspend,线程实际上也不会被挂起,直到达到safe point。它进一步指出safe point 是线程执行中可以执行垃圾收集的点。
我想我的问题不清楚。我意识到线程只能在安全点暂停,并且必须为 GC 暂停,但我似乎无法找到关于什么是安全点的明确答案。是什么决定了代码中的某个点是安全的?
【问题讨论】:
-
CLR 安全,而不是 CLR。
标签: c# garbage-collection clr