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