首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Windows7中,GetThreadContext在SuspendThread成功后失败

在Windows7中,GetThreadContext在SuspendThread成功后失败
EN

Stack Overflow用户
提问于 2011-01-15 06:12:30
回答 1查看 2.4K关注 0票数 19

我在Windows7的采样分析器上遇到了一个奇怪的问题(在以前的Windows OSes上没有这样的问题,无论是32位还是64位)。

分析器的工作方式是定期使用SuspendThread挂起线程,然后使用GetThreadContext查看上下文,然后调用ResumeThread重新启动进程。所有这一切都是在多媒体计时器线程的上下文中完成的(为了精确起见,大约1 1kHZ,在Windows7之前的OSes上,这通常会导致可以忽略不计的性能损失)。

在Windows7下,仅在Windows7下,即使对SuspendThread (和ResumeThread)的调用都成功,但对GetThreadContext的调用失败并出现错误:

ERROR_NOACCESS

998 (0x3E6)

对内存位置的访问无效。

有很高的可能性,尽管不是所有的时间。

我的意思是,对于一些性能分析运行,一切都会像在其他OSes上一样工作(所有GetThreadContext调用都会成功),但对于其他运行,它们几乎都会失败(可能会节省十几次,十万分之一)。它发生在完全相同的二进制文件,相同的参数上。

我已经尝试了关于看起来有点相似的问题的建议,以重复GetThreadContext调用,但没有更多成功。我也尝试过在SuspendThreadGetThreadContext之间做一次Sleep,然后GetThreadContext成功的次数更多了,尽管它会导致严重的减速。

然而,它表明Windows7操作系统正在从SuspendThread返回,而线程可能还没有挂起-尽管,如果是这样的话,我不知道如何或是否正确地等待挂起,在线程中循环和敲击GetThreadContext没有做到这一点。

编辑:按照Dan Bartlett的建议, 16字节对齐GetThreadContextCONTEXT结构的地址似乎正在起作用!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-16 20:01:06

看一下GetThreadContext函数,它提到了

上下文结构是高度特定于处理器的。有关此结构的处理器特定定义和任何对齐要求,请参阅WinNt.h头文件。

看一下这个文件,_CONTEXT被声明为

代码语言:javascript
复制
typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
...

所以这可能是一个对齐问题。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4696543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档