Stavo leggendo sul GC nel libro CLR via C#
, in particolare su quando il CLR vuole iniziare una raccolta. Capisco che deve sospendere i thread prima che si verifichi una raccolta, ma menziona che deve farlo quando il puntatore dell'istruzione di thread raggiunge un punto sicuro. Nei casi in cui non si trova in un punto sicuro, tenta di raggiungerlo rapidamente, e lo fa per hijacking
il thread (inserendo un puntatore a funzione speciale nello stack di thread). Va tutto bene e dandy, ma pensavo che i thread gestiti di default fossero sicuri?Comportamento del GC e dirottamento del thread CLR
Inizialmente avevo pensato che si sarebbe potuto riferire a thread non gestiti, ma il CLR consente ai thread non gestiti di continuare a essere eseguiti perché gli oggetti utilizzati dovrebbero essere stati bloccati comunque.
Quindi, cos'è un
safe point
in un thread gestito e in che modo il GC può determinare di cosa si tratta?
EDIT:
non credo mi veniva abbastanza specifico. In base a this MSDN article, anche quando viene chiamato Thread.Suspend
, la discussione non verrà effettivamente sospesa fino al raggiungimento di safe point
. Si prosegue affermando inoltre che un safe point
è un punto nell'esecuzione di thread in cui è possibile eseguire una garbage collection.
Penso di non essere stato chiaro nella mia domanda. Mi rendo conto che un Thread può essere sospeso solo in un punto sicuro e devono essere sospesi per un GC, ma non riesco a trovare una risposta chiara su quale sia un punto sicuro. Cosa determina un punto nel codice come sicuro?
Sicuro dal CLR, non dal CLR. –