如何在Windows CE下判断线程是否被挂起

7

我能否在Windows CE下使用C或Visual C++获取线程的挂起计数,而不调用resume或suspend函数?唯一我能想到的方法是:

int Count = SuspendThread(ThreadHandle);  
ResumeThread(ThreadHandle);

这有几个问题。首先,我不想挂起线程;其次,如果线程正在运行内核代码,则挂起可能会失败。我可以解决这个问题,但我觉得应该有更优雅的解决方案。我也可以使用相反的方法。
int Count = ResumeThread(ThreadHandle);
SuspendThread(ThreadHandle);  

但是这个方法也存在类似的问题。有没有好的替代方法可以从句柄中获取挂起计数?

4个回答

4
我有一个综合解决方案。使用WaitForSingleObject()来确定线程是否已暂停。
如果没有暂停,则挂起计数显然为0。
如果已暂停,则可以安全地调用SuspendThread()以获取挂起计数。由于它已经被暂停,您不会阻塞任何东西。

是的,这是唯一的方法。 - ctacke
有趣的答案。等待多久,1毫秒在所有情况下是否足够,还是可能会更慢? - SmacL
其实我认为你可以使用等待时间0。WaitForSingleObject()将测试状态并立即返回。你只需要检查返回值是否等于WAIT_OBJECT_0。这将告诉你线程状态已被标记,因此未被挂起。 - ralphtheninja
刚刚检查了一下,很好,谢谢。祝你周末愉快。 - SmacL

1

你永远不应该在任何平台上挂起任何线程。

相反,你应该在线程代码中添加同步点,显式地等待标志变为已发信号才允许继续执行。这样,你就可以知道它将在哪里暂停,或者至少知道它将在安全点暂停。

以下线程操作应该被禁止,无论是哪个平台的程序员都不能使用:

  • 挂起
  • 恢复(如果不能挂起线程,则不需要)
  • 杀死/中止

你永远不应该强制地从外部对线程施加你的意愿。你无法保证它正在做什么,正在锁定什么资源。

始终以合作模式编写线程。你的线程应该意识到自己的环境,并遵循外部世界的意愿,要么有序地退出,要么暂停直到可以安全地继续。


同样,在等待中使用INFINITE应该永远不会发生。 - ctacke
我完全同意,这是一个等待发生的问题。 - Lasse V. Karlsen
经过长时间的繁琐调试,我最终删除了所有的Suspend/Resume调用,并将所有同步对象简化为与两个线程之间通信堆栈相关联的单个互斥量。 - SmacL

0

可能使用WaitForSingleObject,您可以检查线程是否已挂起,但无法检索挂起计数器。


0

即使线程处于活动状态,您仍将收到WAIT_TIMEOUT结果,这是因为线程只在完成时发出信号,而不是在运行时。

也就是说,WaitForSingleObject(hThread,INFINITE)会等待线程完成。


这就是为什么建议等待时间为0,而不是INFINITE。 - ctacke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接