我正在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