簡體   English   中英

如何停止線程並將其寄存器刷新到堆棧中?

[英]How do you stop a thread and flush its registers into the stack?

我正在用C ++創建並發內存回收算法。 需要定期檢查執行mutator線程的堆棧,以便我可以看到線程當前持有的引用。 在執行此操作的過程中,我還需要檢查mutator線程的寄存器以檢查可能存在於其中的任何引用。

很明顯,許多JVM和C#vm在執行此操作時都沒有問題,因為它們是垃圾收集周期的一部分。 但是,我無法找到解決此問題的最終解決方案。

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

理想情況下,我可以使mutator線程被中斷,並執行一段處理程序代碼,該代碼將報告它的PC並將任何基於寄存器的引用刷新到堆棧中,然后可能有助於完成收集周期。 我相信大多數系統中的大多數編譯器會在調用中斷或信號處理程序時自動刷新寄存器,但我不清楚具體細節或如何訪問該數據。 似乎單獨的堆棧可能用於中斷和信號處理程序。 此外,我找不到有關如何定位特定線程或如何發送信號的任何信息。 Windows無論如何似乎都不支持這種形式的信令,我希望我的系統能夠在x86-64處理器上的Linux和Windows上運行。

編輯: SuspendThread()在某些情況下使用,雖然安全點似乎是首選。 有什么想法嗎? 有沒有辦法處理持久的I / O等待或其他等待內核代碼返回?

我認為這是一個非常有趣的問題,所以我稍微挖了一下。 事實證明,Hotspot JVM使用一種稱為“安全點”的機制,這種機制使JVM的線程協同工作,所有這些機制都會自行停止,以便GC可以開始。 換句話說,啟動GC的線程不強制停止其他線程,其他線程通過各種聰明的機制自願掛起自己。

我不相信JVM掃描寄存器,因為定義了一個安全點,所有根都是已知的(我認為這意味着在內存中)。

有關更多信息,請參閱

關於你想要“中斷”所有線程的願望,根據我上面提到的幻燈片,線程暫停“在Solaris和Linux上是不可靠的,例如,虛假信號”。 我不確定滑塊所指的線程懸掛甚至存在什么機制。

在Windows上,您應該能夠使用SuspendThread (和ResumeThread)以及GetThreadContext (如Hans所提到的)完成此操作。 所有這些函數都將句柄處理到您要定位的特定線程。

要獲取當前進程中所有線程的列表,請參閱 (toolhlp32適用於x64,盡管其命名方案不正確......)。

作為一個興趣點,在x86上將寄存器刷新到堆棧的一種方法是使用PUSHAD匯編指令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM