小编coo*_*kid的帖子

如何停止线程并将其寄存器刷新到堆栈中?

我正在用C++创建并发内存回收算法.需要定期检查执行mutator线程的堆栈,以便我可以看到线程当前持有的引用.在执行此操作的过程中,我还需要检查mutator线程的寄存器以检查可能存在于其中的任何引用.

很明显,许多JVM和C#vm在执行此操作时都没有问题,因为它们是垃圾收集周期的一部分.但是,我无法找到解决此问题的最终解决方案.

我不能完全分开Bohem垃圾收集器中发生的事情,以便检查根集,如果可以(或知道它是如何完成的),我真的很想知道.

理想情况下,我可以使mutator线程被中断,并执行一段处理程序代码,该代码将报告它的PC并将任何基于寄存器的引用刷新到堆栈中,然后可能有助于完成收集周期.我相信大多数系统中的大多数编译器会在调用中断或信号处理程序时自动刷新寄存器,但我不清楚具体细节或如何访问该数据.似乎单独的堆栈可能用于中断和信号处理程序.此外,我找不到有关如何定位特定线程或如何发送信号的任何信息.Windows无论如何似乎都不支持这种形式的信令,我希望我的系统能够在x86-64处理器上的Linux和Windows上运行.

编辑: SuspendThread()在某些情况下使用,虽然安全点似乎是首选.有什么想法吗?有没有办法处理持久的I/O等待或其他等待内核代码返回?

c++ concurrency multithreading garbage-collection memory-management

5
推荐指数
1
解决办法
689
查看次数