Estoy creando un algoritmo de recuperación de la memoria concurrente en C++. Periódicamente, las pilas de ejecución de los hilos del mutador deben inspeccionarse, de modo que pueda ver las referencias que están manteniendo actualmente los hilos. En el proceso de hacer esto, también necesito verificar los registros del hilo del mutador para verificar cualquier referencia que pueda estar ahí.¿Cómo detiene un hilo y vacía sus registros en la pila?
Es evidente que muchos # VM de JVM y C no tienen ningún problema en hacer esto como parte de su ciclo de recogida de basura. Sin embargo, no he podido encontrar una solución definitiva a este problema.
No puedo separar lo que está sucediendo en el recolector de basura de Bohem para inspeccionar el conjunto raíz, si puede (o saber cómo se hace), realmente me gustaría saber.
Idealmente podría provocar la interrupción del hilo del mutador y ejecutar un código de controlador que informara que es una PC y también eliminar cualquier referencia basada en registro en la pila, y luego quizás ayudar a terminar el ciclo de recolección . Creo que la mayoría de los compiladores en la mayoría de los sistemas eliminará automáticamente los registros de interrupciones o cuando la señal manejadores son llamados, pero no me queda claro en los detalles, o cómo acceder a esos datos. Parece que se pueden usar pilas separadas para controladores de interrupción y señal. Además, no puedo encontrar ninguna información sobre cómo orientar un tema en particular o cómo enviar una señal. Windows no parece ser compatible con esta forma de señalización de todos modos, y me gustaría que mi sistema se ejecute tanto en Linux como en Windows en los procesadores x86-64.
Edit: SuspendThread() se utiliza en algunas situaciones, aunque parece preferible utilizar safepoints. Alguna idea sobre por qué? ¿Hay alguna manera de lidiar con esperas de E/S duraderas u otras esperas para que vuelva el código del kernel?
No se usa el enjuague, el colector simplemente verifica los registros para referencias de objetos. Fácil de hacer en Windows con GetThreadContext(). –
Bueno, 'GetThreadContext' no lee los registros en absoluto. Lee la memoria en la que se guardaron los registros la última vez que un interruptor de contexto inactivó ese hilo en particular. –
@coolkid: Los compiladores no descargan registros cuando ocurren interrupciones (ni emiten código para hacerlo), eso es una característica de la CPU. –