2011-12-02 95 views
0

平臺:Windows 64位ResumeThread不是在這個特殊的情況下工作

語言:C

我有創建2個線程

  1. 後臺線程
  2. 線程1
  3. 主程序

線程1正在執行函數1(打印名稱在帶有睡眠的循環中執行100次每次打印之間10分鐘)。第一次印刷後,它正在睡10分鐘。

現在後臺線程將掛起Thread1並更改其上下文以執行function2(GetThreadContext,更改Rip,SetThreadContext)並恢復Thread1。

功能2的邏輯是從1打印編號爲100

理想情況下,我期待線程1到後,從後臺線程得到恢復立即運行函數2 ......作爲RIP是指向函數2,不睡覺。

但是,直到10分鐘的睡眠時間,線程1才運行...讓我知道如果我在這裏丟失任何東西。

我從很多天困在這裏...

回答

4

據我所知,暫停/ ResumeThread不保證任何正在運行的內核函數將被中斷。我建議你使用SleepEx讓你的睡眠等待一段時間,並使用QueueUserAPC來告訴它調用你選擇的函數,而不是用線程上下文。

+0

我的要求是.....在任何給定的時間點,在我的應用程序中有n個線程...如果發生任何異常,那麼我想轉儲該線程的調用堆棧.....目前,我有一段使用Stackwalk API的代碼,但這個API不是Threadsafe ...因此我打算移動到RTLCaptureStackBackTrace並自己遍歷堆棧。 – Naveen

+2

在隨機點中斷線程並強制它執行堆棧轉儲代碼也不是真正的線程安全。例如,沒有任何功能可以阻止幀指針保存在寄存器中。我會建議使用谷歌的breakpad庫或其他東西來寫小型轉儲,而不是滾動你自己的,他們已經爲你解決了所有難題。 – bdonlan

+1

或者,使用MiniDumpWriteDump:http://msdn.microsoft.com/en-us/library/windows/desktop/ms680360(v=vs.85).aspx – bdonlan

相關問題