Я создаю параллельный алгоритм восстановления памяти в C ++. Периодически необходимо проверять стеки выполняемых потоков-мутаторов, чтобы я мог видеть, какие ссылки эти потоки в настоящее время хранят. В процессе этого мне нужно также проверить регистры потока мутатора, чтобы проверить любые ссылки, которые могут быть там.
Очевидно, что многие JVM и C # vm не испытывают проблем с выполнением этого в рамках своих циклов сборки мусора. Однако я не смог найти окончательного решения этой проблемы.
Я не могу полностью отделить то, что происходит в сборщике мусора в Богеме, чтобы проверить корневой набор, если вы можете (или знаете, как это делается), я бы очень хотел знать.
В идеале я мог бы вызвать прерывание потока мутатора и выполнить часть кода обработчика, который сообщит о его ПК, а также сбросит все ссылки на основе регистров в стек, а затем, возможно, поможет завершить цикл сбора. Я полагаю, что большинство компиляторов в большинстве систем автоматически сбрасывают регистры при вызове обработчиков прерываний или сигналов, но мне не ясно специфика или то, как получить доступ к этим данным. Кажется, что отдельные стеки могут быть использованы для обработки прерываний и сигналов. Кроме того, я не могу найти информацию о том, как настроить таргетинг на конкретный поток или как отправить сигнал. Windows, похоже, в любом случае не поддерживает эту форму сигнализации, и я хотел бы, чтобы моя система работала как на Linux, так и на Windows на процессорах x86-64.
Edit: SuspendThread () используется в некоторых ситуациях, хотя безопасные точки кажутся предпочтительными. Есть идеи, почему? Есть ли способ справиться с длительными ожиданиями ввода-вывода или другими ожиданиями возврата кода ядра?