Как остановить поток и смыть его регистры в стек?

Я создаю алгоритм одновременной рекультивации памяти на C++. Периодически нужно проверять стеки выполняющихся потоков-мутаторов, чтобы видеть, какие ссылки потоки держат в данный момент. В процессе этого мне нужно также проверить регистры потока-мутатора, чтобы проверить любые ссылки, которые могут там находиться.

Очевидно, что многие JVM и C# vm без проблем делают это в рамках своих циклов сборки мусора. Однако я не смог найти окончательного решения этой проблемы.

Я не могу понять, что происходит в сборщике мусора Bohem, чтобы проверить корневой набор, если вы можете (или знаете, как это делается), я бы очень хотел узнать.

В идеале я бы мог вызвать прерывание потока мутатора и выполнить часть кода обработчика, который бы сообщил, что это PC, а также смыл все ссылки на регистр в стек, а затем, возможно, помог бы завершить цикл сбора. Я полагаю, что большинство компиляторов в большинстве систем автоматически очищают регистры при вызове обработчиков прерываний или сигналов, но я не совсем понимаю специфику, или как получить доступ к этим данным. Кажется, что для обработчиков прерываний и сигналов могут использоваться отдельные стеки. Кроме того, я не могу найти никакой информации о том, как нацелиться на определенный поток или как послать сигнал. Windows, похоже, не поддерживает такую форму передачи сигналов, а я хотел бы, чтобы моя система работала как в Linux, так и в Windows на процессорах x86-64.

Edit: SuspendThread() используется в некоторых ситуациях, хотя безопасные точки кажутся более предпочтительными. Есть идеи, почему? Есть ли способ справиться с длительными ожиданиями ввода-вывода или другими ожиданиями возврата кода ядра?

5
задан coolkid 10 January 2012 в 07:40
поделиться