ResumeThread不是在这个特殊的情况下工作

问题描述:

平台: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才运行...让我知道如果我在这里丢失任何东西。

我从很多天困在这里...

据我所知,暂停/ 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