【问题标题】:How do i know if a thread is suspended under Windows CE我如何知道一个线程是否在 Windows CE 下被挂起
【发布时间】:2010-10-28 05:03:59
【问题描述】:

我能否在 Windows CE 下使用 C 或 Visual C++ 获得线程挂起计数,而无需调用恢复或挂起函数?我能看到的唯一方法是

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

这有几个问题,首先,我宁愿不挂起线程,其次,如果线程正在运行内核代码,挂起可能会失败。我可以解决这个问题,但我觉得应该有一个更优雅的解决方案。我也可以使用

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

但这也有类似的问题。从句柄获取挂起计数的任何好的替代方法?

【问题讨论】:

    标签: c++ c multithreading windows-mobile


    【解决方案1】:

    我有一个组合解决方案。使用 WaitForSingleObject() 判断线程是否被挂起。

    如果没有挂起,那么挂起计数显然是0。

    如果它被挂起,调用 SuspendThread() 来获取挂起计数是安全的。由于它已经暂停,因此您不会停止任何事情。

    【讨论】:

    • 是的,这是唯一的方法。
    • 有趣的答案。等待多长时间,在所有情况下 1 毫秒就足够了,还是可能会更慢?
    • 其实我认为你可以使用等待时间0。WaitForSingleObject()会测试状态并立即返回。您只需要对照 WAIT_OBJECT_0 检查返回值。这会告诉您线程状态已发出信号,因此未挂起。
    • 刚刚检查过,效果很好,谢谢。周末愉快。
    【解决方案2】:

    永远不要暂停任何平台上的任何线程。

    您应该改为在线程代码中添加同步点,明确等待标志发出信号,然后才能继续。这样您知道它将在哪里暂停,或者至少知道它将在安全点暂停。

    对于任何程序员,任何平台都应彻底禁止以下线程操作:

    • 暂停
    • 恢复(因为如果不能挂起线程就不需要了)
    • 杀死/中止

    您永远不应该从外部强行将您的意志强加于线程。你无法保证它在做什么,它当前锁定了什么样的资源。

    始终以协作模式编写线程。您的线程应了解其周围环境,并服从外部世界的意愿,要么有序退出,要么暂停直到可以安全地继续。

    【讨论】:

    • 类似地在等待中使用 INFINITE 永远不会发生。
    • 我完全同意,这是一个等待发生的挂起。
    • +1,经过大量繁琐的调试后,我最终删除了所有挂起/恢复调用,并将所有同步对象减少为与两个线程之间使用的通信堆栈相关的单个互斥锁。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      也就是说 WaitForSingleObject(hThread,INFINITE) 一直等到线程完成。

      【讨论】:

      • 这就是为什么建议的等待是 0,而不是 INFINITE。
      猜你喜欢
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2014-08-09
      • 1970-01-01
      相关资源
      最近更新 更多