我在Windows7的采样分析器上遇到了一个奇怪的问题(在以前的Windows OSes上没有这样的问题,无论是32位还是64位)。
分析器的工作方式是定期使用SuspendThread
挂起线程,然后使用GetThreadContext
查看上下文,然后调用ResumeThread
重新启动进程。所有这一切都是在多媒体计时器线程的上下文中完成的(为了精确起见,大约1 1kHZ,在Windows7之前的OSes上,这通常会导致可以忽略不计的性能损失)。
在Windows7下,仅在Windows7下,即使对SuspendThread
(和ResumeThread
)的调用都成功,但对GetThreadContext
的调用失败并出现错误:
ERROR_NOACCESS
998 (0x3E6)
对内存位置的访问无效。
有很高的可能性,尽管不是所有的时间。
我的意思是,对于一些性能分析运行,一切都会像在其他OSes上一样工作(所有GetThreadContext
调用都会成功),但对于其他运行,它们几乎都会失败(可能会节省十几次,十万分之一)。它发生在完全相同的二进制文件,相同的参数上。
我已经尝试了关于看起来有点相似的问题的建议,以重复GetThreadContext
调用,但没有更多成功。我也尝试过在SuspendThread
和GetThreadContext
之间做一次Sleep
,然后GetThreadContext
成功的次数更多了,尽管它会导致严重的减速。
然而,它表明Windows7操作系统正在从SuspendThread
返回,而线程可能还没有挂起-尽管,如果是这样的话,我不知道如何或是否正确地等待挂起,在线程中循环和敲击GetThreadContext
没有做到这一点。
编辑:按照Dan Bartlett的建议, 16字节对齐GetThreadContext
的CONTEXT
结构的地址似乎正在起作用!
发布于 2011-01-16 20:01:06
看一下GetThreadContext函数,它提到了
上下文结构是高度特定于处理器的。有关此结构的处理器特定定义和任何对齐要求,请参阅WinNt.h头文件。
看一下这个文件,_CONTEXT被声明为
typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
...
所以这可能是一个对齐问题。
https://stackoverflow.com/questions/4696543
复制相似问题