我们有一个Windows32应用程序,其中一个线程可以停止另一个线程来检查它的通过执行SuspendThread/GetThreadContext/ResumeThread状态[PC等]。if(SuspendThread((HANDLE)hComputeThread[threadId])在极少数情况下,在多核系统上,GetThreadContext返回错误代码5(Windows系统错误代码“拒绝访问”)。SuspendThread文档似乎清楚地表明目标线程已挂起,如果没有返回错误。我们正在检查SuspendThread和ResumeThread的返回状态;他们从不提示。为什么我可以挂起
Windows线程能否使用SuspendThread()暂停自身?我可以从另一个唤醒它,但是它可以调用SuspendThread(GetCurrentThreadId())吗? 最佳答案 这似乎是可行的,但稍作改动(请参阅讨论此here的cygwin邮件列表):SuspendThread(GetCurrentThread());我还发现MSDN说一个线程应该只挂起自己,但它对我来说并没有说清楚。我引用(来自here,强调我的):Thisfunctionisprimarilydesignedforusebydebuggers.Itis
更新:Microsoft尚未在Windows8.1中修复它。编辑:结果是bug在WOW64中-当线程在长模式ring-3(用户模式)中挂起时,GetThreadContext()可能会返回陈旧的内容。我已经建议微软使用ring-2来执行翻译。SuspendThread然后只会挂起ring-3中的线程(就像现在一样-无需更改),并且ring-2中的崩溃/故障/利用不会影响内核-它只会影响ring-2和ring-3.此类更改需要更改一些WinAPI函数,例如Wow64Get/SetThreadContext等。这会破坏依赖未记录功能的应用程序,但这是可以预料的。诚然,转换会更慢,因为从ri