Я читал о GC в книге CLR via C#
, а именно о том, когда CLR хочет начать сбор. Я понимаю, что он должен приостанавливать потоки перед сборкой, но в ней упоминается, что она должна делать это, когда указатель инструкции потока достигает безопасной точки. В тех случаях, когда он не находится в безопасном месте, он пытается быстро добраться до него, и он делает это через hijacking
поток (вставка специального указателя функции в стек потока). Что все прекрасное и денди, но я думал, что управляемые потоки по умолчанию были в безопасности?
Первоначально я думал, что это может быть ссылка на неуправляемые потоки, но CLR позволяет неуправляемым потокам продолжать выполнение, потому что любой используемый объект должен был быть закреплен в любом случае.
Итак, что такое safe point
в управляемом потоке и как GC может определить, что это такое?
EDIT:
Я не думаю, что я был достаточно конкретным. Согласно этой статье MSDN, даже когда вызывается Thread.Suspend
, поток фактически не будет приостановлен до достижения safe point
. Далее указывается, что a safe point
является точкой в выполнении потоков, при которой может быть выполнена сборка мусора.
Я думаю, что я был неясен в своем вопросе. Я понимаю, что Thread можно приостановить только в безопасном месте, и их нужно приостановить для GC, но я не могу найти четкого ответа на вопрос о том, что такое безопасная точка. Что определяет точку в коде как безопасную?