我在阅读《CLR via C#》一书中关于GC的内容,具体是当CLR想要开始垃圾回收时。我知道在进行回收之前必须暂停线程,但它提到必须在线程指令指针到达安全点时才能这样做。在不安全点的情况下,它会尝试快速到达一个安全点,并通过“劫持”线程(在线程堆栈中插入特殊函数指针)来实现。这很好,但我认为默认情况下托管线程是安全的,难道不是吗?
起初我以为它可能是指非托管线程,但CLR让非托管线程继续执行,因为任何正在使用的对象都应该被固定。
那么,在托管线程中,什么是“安全点”,GC如何确定它的位置?
编辑:
我认为我没有说得够清楚。根据此MSDN文章,即使调用了Thread.Suspend,线程也不会真正暂停,直到达到“安全点”。它进一步声明,“安全点”是线程执行的一个点,可以在其中执行垃圾回收。
我觉得我的问题表述不够清晰。我意识到线程只能在安全点暂停,它们必须被暂停以进行GC,但我似乎找不到关于什么是安全点的明确答案。什么决定代码中的一个点是安全的?
起初我以为它可能是指非托管线程,但CLR让非托管线程继续执行,因为任何正在使用的对象都应该被固定。
那么,在托管线程中,什么是“安全点”,GC如何确定它的位置?
编辑:
我认为我没有说得够清楚。根据此MSDN文章,即使调用了Thread.Suspend,线程也不会真正暂停,直到达到“安全点”。它进一步声明,“安全点”是线程执行的一个点,可以在其中执行垃圾回收。
我觉得我的问题表述不够清晰。我意识到线程只能在安全点暂停,它们必须被暂停以进行GC,但我似乎找不到关于什么是安全点的明确答案。什么决定代码中的一个点是安全的?