我正在C++中创建一个并发内存回收算法。定期执行mutator线程的堆栈需要检查,以便我可以看到线程当前拥有哪些引用。在这个过程中,我还需要检查mutator线程的寄存器以检查可能存在的任何引用。如何停止线程并将其寄存器清空到堆栈中?
很明显,许多JVM和C#虚拟机在做垃圾收集周期的过程中没有问题。但是,我一直无法找到这个问题的确切解决方案。
为了检查根集(如果可以的话)(或者知道它是如何完成的),我无法弄清楚Bohem垃圾回收器正在发生什么,我真的很想知道。
理想情况下,我将能够使中断线程中断,并执行一段处理程序代码,它会报告它是PC,并将基于寄存器的引用清空到堆栈中,然后可能有助于完成收集周期。我相信大多数系统中的大多数编译器会在调用中断或信号处理程序时自动刷新寄存器,但我不清楚具体情况或如何访问这些数据。看起来单独的堆栈可能用于中断和信号处理程序。另外,我找不到有关如何定位特定线程或如何发送信号的任何信息。 Windows似乎并不支持这种信号形式,并且我希望我的系统能够在x86-64处理器上的Linux和Windows上运行。
编辑:在某些情况下使用SuspendThread(),尽管安全点似乎是首选。任何想法为什么?有没有办法处理持久的I/O等待或其他等待内核代码返回的方法?
不使用刷新,收集器只是检查寄存器中的对象引用。使用GetThreadContext()可以在Windows中轻松完成。 – 2012-01-10 04:58:40
好吧,'GetThreadContext'完全不读取寄存器。它读取内存寄存器保存到最后一次上下文切换使该特定线程无效的时间。 – 2012-01-10 06:25:04
@coolkid:编译器在中断发生时不会刷新寄存器(也不会发出代码),这是CPU本身的一个特性。 – 2012-01-10 06:26:07