Я читал о GC в книге CLR через C #
, в частности о том, когда CLR хочет запустить сбор . Я понимаю, что он должен приостановить потоки до того, как произойдет сбор, но он упоминает, что он должен сделать это, когда указатель инструкции потока достигает безопасной точки. В тех случаях, когда он не в безопасной точке, он пытается добраться до о ne быстро, и это достигается путем перехвата
потока (вставки специального указателя функции в стек потока). Это все прекрасно, но я думал, что управляемые потоки по умолчанию безопасны?
Сначала я подумал, что это могло относиться к неуправляемым потокам, но CLR позволяет неуправляемым потокам продолжать выполнение, потому что любой используемый объект все равно должен был быть закреплен. .
Итак, что такое безопасная точка
в управляемом потоке, и как GC может определить, что это такое?
РЕДАКТИРОВАТЬ:
Я не думаю, что я был достаточно конкретным. Согласно этой статье MSDN , даже когда вызывается Thread.Suspend
, поток фактически не будет приостановлен до тех пор, пока не будет достигнута безопасная точка
. Далее говорится, что безопасная точка
- это точка в выполнении потоков, в которой может выполняться сборка мусора.
Думаю, я не совсем понял свой вопрос. Я понимаю, что поток может быть приостановлен только в безопасной точке, и они должны быть приостановлены для GC, но я не могу найти четкого ответа о том, что такое безопасная точка. Что определяет безопасный фрагмент кода?